学习日记1105--多线程间的通信(生产者消费者)(1)
2014-11-05 20:23
162 查看
<p>今天主要学习了多线程间的通信,并对毕老师所讲的内容作了认真的理解分析,内容整理如下: </p><p>在生产者消费者程序运行过程中,可能出现生产两个消费一个或者生产一个消费两个的情况,如下图所示。对其产生原因进行分析,并指出改进方法。</p><p><img src="http://img.blog.csdn.net/20141105202626609?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDM3ODMyMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></p><p><span style="font-family: Arial, Helvetica, sans-serif;">生产者消费者两个进程中的同步代码如下:</span></p><p><span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="java">public synchronized void input(String name) { if(flag) try { this.wait(); } catch (Exception e) { } this.name = name + count++; System.out.println(Thread.currentThread().getName()+"...生产者"+this.name); flag = true; this.notify(); } public synchronized void out() { if(!flag) try { this.wait(); } catch (Exception e) { } System.out.println(Thread.currentThread().getName()+"-----------消费者"+this.name); flag = false; notify(); }
对其执行过程进行分析:
根本原因:唤醒本方线程,且t1唤醒t2时,直接从等待位置,直接向下执行而未判断标记。
解决办法:(1)循环判断标记,将if条件判断,改为while循环判断
(2)唤醒对方线程,将notify()(仅唤醒线程池中的一个线程)改为notifyAll()(唤醒线程池中的所有线程)
改进后的代码如下:
public synchronized void input(String name) { while(flag) try { this.wait(); } catch (Exception e) { } this.name = name + count++; System.out.println(Thread.currentThread().getName()+"...生产者"+this.name); flag = true; this.notifyAll(); } public synchronized void out() { while(!flag) try { this.wait(); } catch (Exception e) { } System.out.println(Thread.currentThread().getName()+"-----------消费者"+this.name); flag = false; notifyAll(); }
接下来是JDK1.5中对多线程的升级方案
相关文章推荐
- Java基础学习__多线程(线程间通信--生产者消费者JDK5.0升级版)
- Java基础学习6_多线程(线程间通信--生产者消费者)
- 多线程学习Demo注解(3)——生产者和消费者
- 多线程学习——消费者生产者(1)
- java多线程-线程间通信_生产者消费者
- 黑马程序员-----多线程之间的通信(生产者消费者)
- 多线程执行多任务(线程通信):生产者消费者模型(二)
- 多线程之间的通信生产者和消费者
- java中多线程通信实例:生产者消费者模式
- JAVA学习笔记(1)_____模拟线程通信之生产者消费者问题
- C#多线程学习之(三)生产者和消费者用法分析
- 多线程—03—线程间通信、生产者消费者
- 多线程学习——消费者生产者(2)
- javaSE-多线程间通信-生产者消费者例子
- JAVA学习第二十七课(多线程(六))- 多生产者多消费者问题(JDK1.5新特性)
- 训练营学习笔记 java多线程(五)生产者/消费者
- 黑马程序员--JAVA基础复习之多线程(三)线程间通信 生产者消费者
- JAVA多线程学习--生产者消费者问题
- 黑马程序员_日记18_Java多线程(八)--生产者消费者问题JDK1.5特性
- 多线程执行多任务(线程通信):生产者消费者模型(一)