java多线程---等待/唤醒以及生产者消费者经典同步synchronized的实现
来源:互联网 发布:linux redhat中文乱码 编辑:程序博客网 时间:2024/06/06 03:42
一个线程开始执行后就进入等待,然后另外一个线程来唤醒它
代码如下:
package com.zcj.thread02;public class Thread01 { private static Object object= new Object(); public static void main(String[] args) { ThreadA theA = new ThreadA(object); ThreadB threadB = new ThreadB(object); theA.start(); try {Thread.sleep(3000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} threadB.start(); }}class ThreadA extends Thread{private Object object;public ThreadA(Object object){this.object=object;}@Overridepublic void run(){synchronized (object) {try {System.out.println("我开始等待。。。");object.wait();System.out.println("我被唤醒了,不再等待");} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}class ThreadB extends Thread{private Object object;public ThreadB(Object object){this.object=object;}@Overridepublic void run(){synchronized (object) {object.notify();}}}一个消费者和一个生产者的同步问题:
package com.zcj.thread02;public class Thread01 { public int count= 0; public void produce(){ synchronized (this) {if(count==1){try {this.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} }System.out.println("我生产商品!");count=1;this.notify();} } public void consumer(){ synchronized (this) { if(count==0){ try { this.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} } System.out.println("我消费商品"); count=0; this.notify();} } public static void main(String[] args) { Thread01 thd = new Thread01(); ThreadA threadA = new ThreadA(thd); ThreadB threadB = new ThreadB(thd); threadA.start(); threadB.start(); }}class ThreadA extends Thread{private Thread01 thd;public ThreadA(Thread01 thd){this.thd=thd;}@Overridepublic void run(){ while(true){ thd.produce(); }}}class ThreadB extends Thread{private Thread01 thd;public ThreadB(Thread01 thd){this.thd=thd;}@Overridepublic void run(){while(true){thd.consumer();}}}
多个生产者和多个消费者的例子如下:注意其中变化的部分,while和notifyAll();不过使用synchronized有个问题就是唤醒的时候不能有所指定的唤醒对应的线程:
首先解释下这里为什么会使用while语句来判断:因为如果在用if的时候,当线程获得锁再次进入临界区就不会再去判断条件了,多个线程一起工作的时候就可能导致count的值超过1,另外在多个消费线程在消费的时候也可能导致下面count最终消费后的数量低于0,这样不就不符合逻辑了。使用notifyAll的原因是比如多个生产者和多个消费者一起工作,假如某个生产者开始等待,他唤醒的可能是另外一个生产者,这样另外一个生产者也进入等待,就存在一种情况导致消费者一直得不到唤醒,任务就进行不了了
package com.zcj.thread02;public class Thread01 { public int count= 0; public void produce(){ synchronized (this) {while(count==1){try {this.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} }System.out.println("我生产商品!");count=1;this.notifyAll();} } public void consumer(){ synchronized (this) { while(count==0){ try { this.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} } System.out.println("我消费商品"); count=0; this.notifyAll();} } public static void main(String[] args) { Thread01 thd = new Thread01(); ThreadA threadA = new ThreadA(thd); ThreadA threadA1 = new ThreadA(thd); ThreadB threadB = new ThreadB(thd); ThreadB threadB1 = new ThreadB(thd); threadA.start(); threadA1.start(); threadB.start(); threadB1.start(); }}class ThreadA extends Thread{private Thread01 thd;public ThreadA(Thread01 thd){this.thd=thd;}@Overridepublic void run(){ while(true){ thd.produce(); }}}class ThreadB extends Thread{private Thread01 thd;public ThreadB(Thread01 thd){this.thd=thd;}@Overridepublic void run(){while(true){thd.consumer();}}}
0 0
- java多线程---等待/唤醒以及生产者消费者经典同步synchronized的实现
- java多线程---等待/唤醒以及生产者消费者经典同步Lock的实现
- 多线程-等待唤醒机制经典案例-生产者消费者
- java 分别利用synchronized和jdk1.5新特性实现多消费者-多生产者线程的等待唤醒机制
- 多线程_生产者消费者之等待唤醒机制代码实现
- 多线程-生产者消费者之等待唤醒机制
- Java多线程生产者消费者说明等待唤醒机制问题和虚假唤醒问题
- java多线程实现生产者/消费者同步
- 多线程——等待唤醒机制经典实例:生产者消费者模式
- 多线程——等待唤醒机制经典实例:生产者消费者模式(优化)
- 多线程经典问题之生产者消费者问题的JAVA实现
- java多线程经典的生产者消费者问题
- 多线程_生产者消费者之等待唤醒机制思路图解
- 多线程_生产者消费者之等待唤醒机制代码分析
- 多线程_生产者消费者之等待唤醒机制代码优化
- 多线程-生产者消费者之等待唤醒机制代码优化
- java多线程中的等待唤醒机制--多生产者多消费者问题
- java多线程之 生产者和消费者 线程间通信 等待与唤醒机制
- typedef block
- 全排列(含有重复元素)
- 1094. The Largest Generation (25)
- CodeForces - 675C Money Transfers (map&技巧)
- 如何使用定时器settimeout、setInterval执行能传递参数的函数
- java多线程---等待/唤醒以及生产者消费者经典同步synchronized的实现
- spring的基础知识
- Java基础知识:面向对象-抽象、接口、内部类
- 第11章:散列表
- Linux系统下安装flash player插件
- tiny_cnn源码阅读(3)-layer_base和layer
- 奇妙的事情
- Android压缩图片到100K以下并保持不失真的高效方法
- 第21章:用于不相交集合的数据结构