04_张孝祥_Java多线程_传统线程同步通信技术
来源:互联网 发布:nginx添加lua模块 编辑:程序博客网 时间:2024/05/29 18:29
需求
一个主线程,一个子线程。子线程循环5次,接着换主线程循环10次,接着又回到子线程循环15次,接着再回到主线程又循环10次,如此循环10次
分析
1、主进程子进程存在线程同步问题,对于同步的内容应该封装在一个类中,在类中定义主进程和子进程需要操作的方法,通过获得锁而执行各自的方法。
2、这里存在子进程和主进程交替运行,应该添加一个信号变量,主进程和子进程判断该状态是否可以执行,主进程或子进程一次循环结束重置该变量值,然后调用notify(notifyallAll)方法来唤醒其他等待共享对象释放的线程。
实现
定义一个类Business,定义主进程和子进程执行的方法,主进程和子进程对同一个对象business操作,通过使用synchronized作用在该对象相应的方法 从而达到同步的作用。类Business中定义一个交换变量bShouldSub来使得进程交替执行,主进程或子进程执行完都会更改该变量的值,然后调用this.notify
来唤醒其他等待对象business(this)的线程。
package cn.itcast.heima2;import java.util.concurrent.atomic.AtomicInteger;public class TraditionalThreadCommunication { /** * @param args */ public static void main(String[] args) { final Business business = new Business(); new Thread( new Runnable() { @Override public void run() { for(int i=1;i<=10;i++){ business.sub(i); } } } ).start(); for(int i=1;i<=10;i++){ business.main(i); } }} class Business { private boolean bShouldSub = true; public synchronized void sub(int i){ while(!bShouldSub){ try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } for(int j=1;j<=5;j++){ System.out.println("sub thread sequence of " + j + ",loop of " + i); } bShouldSub = false; this.notify(); } public synchronized void main(int i){ while(bShouldSub){ try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } for(int j=1;j<=10;j++){ System.out.println("main thread sequence of " + j + ",loop of " + i); } bShouldSub = true; this.notify(); } }
注意:
<<Effective Java>>中提到,永远不要在循环之外调用wait方法。因为,参考:为什么wait()语句要放在while循环之内
阅读全文
0 0
- 04_张孝祥_Java多线程_传统线程同步通信技术
- 多线程04_张孝祥-传统线程同步通信技术
- 01_张孝祥_Java多线程_传统线程技术回顾
- 03_张孝祥_Java多线程_传统线程互斥技术_Synchronized
- 多线程03_张孝祥-传统线程互斥技术
- 02_张孝祥_Java多线程_传统定时器Timer
- 黑马程序员_多线程(2) 传统线程通信&Condtion
- 传统线程同步通信技术
- 传统线程同步通信技术
- 传统线程同步通信技术
- 多线程_线程同步
- 11_张孝祥_多线程_线程锁技术
- 【Java多线程与并发库】04 传统的线程同步通信技术-synchronized/wait/notify/notifyAll
- 多线程01_张孝祥-传统线程的3种创建
- 线程_多线程_同步机制
- 黑马程序员_多线程(1) 传统线程
- 【张孝祥并发课程笔记】03:传统线程同步通信技术
- JAVASE_12_%多线程_线程通信
- Java企业微信开发_01_接收消息服务器配置
- Eclipse运行性能调优(含eclipse.ini)
- 使用Jquery插件jsonview来展示json数据
- STM32+W5500使用IAR FOR ARM建立工程详细到编译过程
- 2017.12.16
- 04_张孝祥_Java多线程_传统线程同步通信技术
- 机器学习基石作业1-17-PLA 的c++实现
- 小象学院2017年最新基于Python数据分析班升级版高清精品推荐
- 高斯混合模型聚类算法和K-Means聚类算法
- open layer4加载wms
- vue click ios11 点击第二次才有效,vue click ios11 点击第二次才有效
- yarn资源管理最佳实践
- onLayout笔记(mTop,layout,setFrame,getMeasureWidth,getWidth)
- (1)SpringCloud 整合Python