04_张孝祥_Java多线程_传统线程同步通信技术
2017-12-16 12:53
375 查看
需求
一个主线程,一个子线程。子线程循环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循环之内相关文章推荐
- 【Java多线程与并发库】04 传统的线程同步通信技术-synchronized/wait/notify/notifyAll
- java多线程之传统线程同步通信技术
- Java并发04---传统线程同步通信技术
- java并发-多线程之传统线程同步通信技术(4)
- 张孝祥_Java多线程与并发库高级应用04
- 02_张孝祥_Java多线程_传统定时器Timer
- 01_张孝祥_Java多线程_传统线程技术回顾
- 【java多线程与并发库】---传统java多线程<2> 线程创建方式
- 张孝祥[致敬]-多线程学习第02课 传统定时器的使用
- Java多线程系列--“JUC线程池”04之 线程池原理(三)
- Java多线程系列--“基础篇”04之 synchronized关键字 (r)
- Java多线程基础篇(04)-线程同步机制和线程间通信
- java 传统多线程
- 【Java多线程与并发库】3.传统线程互斥技术
- JAVA 并发编程-传统线程同步通信技术(四)
- 09_张孝祥_多线程_java5线程并发库的应用_线程池
- [零基础学JAVA]Java SE应用部分-26.多线程(04) 推荐
- java基础——多线程(传统定时器)
- Java多线程基础(三)Java传统线程互斥技术
- (原创)JAVA多线程一传统多线程