关于Java线程通讯的学习日志
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线程通讯的学习日志相关推荐
- java线程之基础学习
java线程之基础学习总结 线程实现的两种方式: 在java中可以有两种方式实现多线程操作,一种是继承Thread类,另外一种是实现Runnable接口. 继承Thread类 Thread类是在jav ...
- java线程通讯的方式
java线程通讯的方式主要有三种 suspend/resume wait/notify park/unpark suspend/resume 正常的suspend/resume public void ...
- java 线程通讯_java多线程(五)线程通讯
1.1. 为什么要线程通信 多个线程并发执行时,在默认情况下CPU是随机切换线程的,有时我们希望CPU按我们的规律执行线程,此时就需要线程之间协调通信. 1.2. 线程通讯方式 线程间通信常用方式如下 ...
- java多线程基础篇(二)java线程常见问题Thread Dump日志分析
线程常见问题 CPU占用率很高,响应很慢 CPU占用率不高,但响应很慢 线程出现死锁的情况 CPU占用率不高,但响应很慢 有的时候我们会发现CPU占用率不高,系统日志也看不出问题,那么这种情况下,我们 ...
- java线程wait_java多线程学习(四) 之 wait和notify
ynchronized让线程之间互斥,但是有时候因为业务逻辑,需要主动释放锁,让其它的线程执行,这就需要线程之间通信,我们知道JAVA里每个对象都有个隐式锁,JAVA为每个对象都提供了wait和not ...
- java listfile为null_java学习日志---File实例:实现复制整个文件夹、解决listFiles()为null问题...
需求:将H盘下的所有文件复制到H:/All 文件夹中 思路:使用递归遍历整个目标目录 传入目标路径 判断是否是文件夹 是:调用listFiles()方法,得到File数组,重点内容接着执行1 否:复制 ...
- 打开Java之门——一个Java SE小白的学习日志1【极客BOY-米奇】
文章目录 前言(转载请说明作者:极客BOY) 打开Java之门 Why learn Java? Java's History What's the "Java JDK"? Theo ...
- Java线程池详解学习:ThreadPoolExecutor
Java线程池详解学习:ThreadPoolExecutor Java的源码下载参考这篇文章:Java源码下载和阅读(JDK1.8) - zhangpeterx的博客 在源码的目录java/util/ ...
- Java 线程池详解学习:FixedThreadPool,CachedThreadPool,ScheduledThreadPool...
Java常用的线程池有FixedThreadPool和CachedThreadPool,我们可以通过查看他们的源码来进行学习. Java的源码下载参考这篇文章:Java源码下载和阅读(JDK1.8) ...
最新文章
- 福利内卷时代来临!腾讯为 3300 名员工发 11 亿红包
- 10-20国际标准导联系统
- python判断网页密码加密方式_python实现网页登录时的rsa加密流程
- DevExpress GridControl使用(二)
- ITK读取CT DICOM,如何设置窗位和窗宽?
- 康普顿效应是弹性碰撞吗_如何正确解读物理实验结果系列之十二——康普顿效应与光子...
- 修复IE下列表 li 底部空行Bug
- nosql数据库之Redis持久化、备份和主从配置
- 异步promise、Async/await介绍
- 局域网中抓到NBNS数据包
- matlab刻度字体,matlab 设置横纵坐标刻度的字体!!
- python的spider如何让鼠标不_python wooyun爬虫模拟鼠标等
- CCIE实验笔记之---第1章WAN协议(HDLC)
- 《Python自然语言处理(第二版)-Steven Bird等》学习笔记:第01章 语言处理与Python
- android 4.4 x86 iso,android x86官方版下载_android x86 4.4 iso 官方最新版[网盘资源]_零度软件园...
- ifft2 二维快速傅里叶逆变换(Matlab)
- 深度学习之openvino预训练模型测试(车牌识别)
- 什么是多态?为什么使用多态?
- 华为服务器gpu卡型号,GPU运算服务器推荐
- 【嵌入式Linux学习笔记】Linux驱动开发