Java中线程通讯

主要涉及对并发线程的操控

1.利用synchronized进行对象锁定实现对线程的控制

2.使用lock condition进行线程控制

3.使用管道(Piped)Stream

为什么要用线程通讯,常见的就是需要访问同一个对象,根据对象的值进行相关的操作
举个例子

小王是个程序员,今天收到客户A反馈的线上bug需要修改,产品经理B告诉小王页面也有点问题需要调整。

小王同时只能干一件事,要么改bug,要么调整页面。那么小王怎么安排呢。
小王考虑了一下想到自己的方案,先把bug修改完成,等待客户反馈,然后修改页面,改完以后交于产品确认。

等待客户反馈的时间小王可以先去修改页面,但是如果客户反馈有问题,小王需要继续修复bug

  • synchronized 实现

可以定义线程了 
FixBugThread

public class FixBugThread2 implements Runnable {private Object person;public FixBugThread2(Object person){this.person = person;}@Overridepublic void run() {synchronized (person){System.out.println("*********修复bug中********");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("*********bug修复完成********");person.notify();}}
}

MakePageThread


public class MakePageThread2 implements Runnable {private Object person;public MakePageThread2(Object person) {this.person = person;}@Overridepublic void run() {synchronized (person) {System.out.println("*********页面调整中********");for (int i = 0; i < 10; i++) {System.out.println("*********页面调整中" + i*10 + "% ********");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("*********页面调整完成********");person.notify();}}
}

定义完以后 我们跑一下

    public static void main(String[] args) throws InterruptedException {System.out.println("开始运行");Object a = new Object();FixBugThread2 fbt = new FixBugThread2(a);MakePageThread2 mpt = new MakePageThread2(a);new Thread(fbt).start();new Thread(mpt).start();System.out.println("结束运行");
}

运行结果:

开始运行
*********修复bug中********
*********bug修复完成********
*********页面调整中********
*********页面调整中0% ********
*********页面调整中10% ********
*********页面调整中20% ********
*********页面调整中30% ********
*********页面调整中40% ********
*********页面调整中50% ********
*********页面调整中60% ********
*********页面调整中70% ********
*********页面调整中80% ********
*********页面调整中90% ********
*********页面调整完成********
结束运行

但是这是理想情况,小王一次性把bug解决掉了,实际情况是小王修改完bug以后,在调整页面的过程过客户又找来了,bug没有完全修复,小王需要再次修改bug。那怎么处理呢?我们需要终止makePage线程,然后小王再次修改bug

所以对于调整页面的线程类方法我们要加上自己的控制

public class MakePageThread2 implements Runnable {private Object person;private  Boolean isEnabled = true;private  Integer runTime = 10;private  Integer currentRunCount = 0;public MakePageThread2(Object person) {this.person = person;}@Overridepublic void run() {
/*        while (true)System.out.println("**************MakePage");*/synchronized (person) {System.out.println("*********页面调整中********");while (true){while (isEnabled){System.out.println("*********页面调整中" + currentRunCount*10 + "% ********");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}currentRunCount++;if( currentRunCount >=runTime){person.notify();break;}}if(!isEnabled){try {person.wait(2000);} catch (InterruptedException e) {e.printStackTrace();}}if( currentRunCount >=runTime){person.notify();break;}}System.out.println("*********页面调整完成********");person.notify();}}public void stop(){isEnabled = false;System.out.println("*********页面调整被打断********");}public void continueRun(){isEnabled = true;}
}

这块代码主要目的是就是一直运行知道完成页面调整,如果中间外部通知需要打断,就暂停运行。等待外部通知。

所以 对应main中的调用 我就改成了如下代码

        System.out.println("开始运行");Object a = new Object();FixBugThread2 fbt = new FixBugThread2(a);MakePageThread2 mpt = new MakePageThread2(a);Thread fixBugT = new Thread(fbt);Thread makePageT = new Thread(mpt);fixBugT.start();//修复bugmakePageT.start();//调整页面System.out.println("主线程开始休眠");Thread.sleep(1000);System.out.println("主线程结束休眠");mpt.stop();//bug没改好 停止调整页面new Thread(fbt).start();//重新修改bugmpt.continueRun();//改完bug以后继续调整页面
  • Lock 实现 

使用Condition往往比使用传统的通知等待机制(Object的wait()/notify())要更灵活、高效,例如,我们可以使用多个Condition实现通知部分线程

  • PipedInputStream类 与 PipedOutputStream类

关于Java线程通讯的学习日志相关推荐

  1. java线程之基础学习

    java线程之基础学习总结 线程实现的两种方式: 在java中可以有两种方式实现多线程操作,一种是继承Thread类,另外一种是实现Runnable接口. 继承Thread类 Thread类是在jav ...

  2. java线程通讯的方式

    java线程通讯的方式主要有三种 suspend/resume wait/notify park/unpark suspend/resume 正常的suspend/resume public void ...

  3. java 线程通讯_java多线程(五)线程通讯

    1.1. 为什么要线程通信 多个线程并发执行时,在默认情况下CPU是随机切换线程的,有时我们希望CPU按我们的规律执行线程,此时就需要线程之间协调通信. 1.2. 线程通讯方式 线程间通信常用方式如下 ...

  4. java多线程基础篇(二)java线程常见问题Thread Dump日志分析

    线程常见问题 CPU占用率很高,响应很慢 CPU占用率不高,但响应很慢 线程出现死锁的情况 CPU占用率不高,但响应很慢 有的时候我们会发现CPU占用率不高,系统日志也看不出问题,那么这种情况下,我们 ...

  5. java线程wait_java多线程学习(四) 之 wait和notify

    ynchronized让线程之间互斥,但是有时候因为业务逻辑,需要主动释放锁,让其它的线程执行,这就需要线程之间通信,我们知道JAVA里每个对象都有个隐式锁,JAVA为每个对象都提供了wait和not ...

  6. java listfile为null_java学习日志---File实例:实现复制整个文件夹、解决listFiles()为null问题...

    需求:将H盘下的所有文件复制到H:/All 文件夹中 思路:使用递归遍历整个目标目录 传入目标路径 判断是否是文件夹 是:调用listFiles()方法,得到File数组,重点内容接着执行1 否:复制 ...

  7. 打开Java之门——一个Java SE小白的学习日志1【极客BOY-米奇】

    文章目录 前言(转载请说明作者:极客BOY) 打开Java之门 Why learn Java? Java's History What's the "Java JDK"? Theo ...

  8. Java线程池详解学习:ThreadPoolExecutor

    Java线程池详解学习:ThreadPoolExecutor Java的源码下载参考这篇文章:Java源码下载和阅读(JDK1.8) - zhangpeterx的博客 在源码的目录java/util/ ...

  9. Java 线程池详解学习:FixedThreadPool,CachedThreadPool,ScheduledThreadPool...

    Java常用的线程池有FixedThreadPool和CachedThreadPool,我们可以通过查看他们的源码来进行学习. Java的源码下载参考这篇文章:Java源码下载和阅读(JDK1.8) ...

最新文章

  1. 福利内卷时代来临!腾讯为 3300 名员工发 11 亿红包
  2. 10-20国际标准导联系统
  3. python判断网页密码加密方式_python实现网页登录时的rsa加密流程
  4. DevExpress GridControl使用(二)
  5. ITK读取CT DICOM,如何设置窗位和窗宽?
  6. 康普顿效应是弹性碰撞吗_如何正确解读物理实验结果系列之十二——康普顿效应与光子...
  7. 修复IE下列表 li 底部空行Bug
  8. nosql数据库之Redis持久化、备份和主从配置
  9. 异步promise、Async/await介绍
  10. 局域网中抓到NBNS数据包
  11. matlab刻度字体,matlab 设置横纵坐标刻度的字体!!
  12. python的spider如何让鼠标不_python wooyun爬虫模拟鼠标等
  13. CCIE实验笔记之---第1章WAN协议(HDLC)
  14. 《Python自然语言处理(第二版)-Steven Bird等》学习笔记:第01章 语言处理与Python
  15. android 4.4 x86 iso,android x86官方版下载_android x86 4.4 iso 官方最新版[网盘资源]_零度软件园...
  16. ifft2 二维快速傅里叶逆变换(Matlab)
  17. 深度学习之openvino预训练模型测试(车牌识别)
  18. 什么是多态?为什么使用多态?
  19. 华为服务器gpu卡型号,GPU运算服务器推荐
  20. 【嵌入式Linux学习笔记】Linux驱动开发

热门文章

  1. 广州、上海两地泵管阀展在行业的热切盼望中重启
  2. 云服务器8M带宽怎么样?实际速度如何?
  3. 计算机窗口预览图,win10系统任务栏缩略图窗口预览速度提升的操作方法
  4. 原码、反码、补码和移码其实很简单
  5. Java32位Win7系统Jdk_win7 32位旗舰版配置与调试JDK环境技巧【图文】
  6. 蒙哥马利幂模算法(二分快速幂)
  7. 到底该如何看待5.5G?
  8. JPA中No entity found for query
  9. Python基础篇1:输入直角三角形的两个直角边的长度a、b,求斜边c的长度
  10. 网络工程师岗位的职责和理解以及所需要掌握的技术有哪些?