JAVA多线程-生产者与消费者当线程多时发生死锁的解决方法
2008-11-29 14:54
1001 查看
快要考JAVA了,研究了一下书上的生产者与消费者的实例,书上只是单个消费者与单个生产者的程序,我在它的基础上,改成多个生产者多个消费者,不幸的事情发生了,居然给死锁掉了,百思不得其解,研究了整个早上,后台通过和老师的讨论终于找到了原因-------notify()是随机唤醒一个线程
如果生产者生产好东西,然后一直随机唤醒的线程都是生产者那就产生死锁了,改用notifyAll()则可以避免死锁,但是效率会降低,不过总比死锁来的好得多。
程序代码:
common仓库类
消费者:
生产者:
main函数
如果生产者生产好东西,然后一直随机唤醒的线程都是生产者那就产生死锁了,改用notifyAll()则可以避免死锁,但是效率会降低,不过总比死锁来的好得多。
程序代码:
common仓库类
package threadlocktest; /** * * @author DJ尐舞 */ public class common { private char ch; private boolean available = false; synchronized char get() { while (available == false) { try { wait(); } catch (InterruptedException e) { } } available = false; notifyAll(); return ch; } synchronized void put(char newch) { while (available == true) { try { wait(); } catch (InterruptedException e) { } } ch=newch; available = true; notifyAll(); } }
消费者:
package threadlocktest; /** * * @author DJ尐舞 */ public class consumer extends Thread{ private common comm; public consumer(common thiscomm){ this.comm=thiscomm; } public void run(){ char c; for(int i=0;i<5;i++){ c=comm.get(); System.out.println("消费者得到的数据是:"+c); } } }
生产者:
package threadlocktest; /** * * @author DJ尐舞 */ public class producer extends Thread { private common comm; public producer(common thiscomm) { comm = thiscomm; } public void run(){ char c; for(c='a';c<='e';c++){ comm.put(c); System.out.println("生产者者的数据是:"+c); } } }
main函数
package threadlocktest; /** * * @author DJ尐舞 */ public class Main { /** * @param args the command line arguments */ public static void main(String[] args) { common comm = new common(); for (int i = 0; i < 100; i++) { new producer(comm).start(); new consumer(comm).start(); } } }
相关文章推荐
- 多线程(线程间通信-多生产者多消费者问题-JDK1.5解决办法-范例),停止线程,线程中方法的区别,匿名内部类实现多线程,线程总结
- java多线程一 基本实现方法、消费者生产者队列、死锁
- java 多线程学习之多生产者多消费者产生的线程安全问题分析与解决:Lock和Condition
- JAVA笔记14__多线程共享数据(同步)/ 线程死锁 / 生产者与消费者应用案例 / 线程池
- Java 多线程(三)线程间的通信jdk1.5中Lock,Condition---生产者消费者为例
- java多线程之 生产者和消费者 线程间通信 等待与唤醒机制
- Java Note: 多线程的同步(互斥锁)的方法对比,信号量锁,读写锁的实现,生产者-消费者模式的实现
- Java线程同步与死锁、生产者消费者模式以及任务调度等
- Java多线程之死锁的出现和解决方法
- 从java多线程实现“生产者-消费者”模型来谈谈操作系统中线程状态的转换及线程同步的总结
- Java多线程㈣—①线程间通讯(生产者及消费者)
- Java基础学习6_多线程(线程间通信--生产者消费者)
- java多线程:线程间的通信-生产者和消费者(三)
- 多线程编程:线程死锁的原因以及解决方法
- java 生产者消费者问题-多线程与死锁
- java 中多线程之间的通讯之生产者和消费者 (多个线程之间的通讯)
- Java Note: 多线程的同步(互斥锁)的方法对比,信号量锁,读写锁的实现,生产者-消费者模式的实现
- Java多线程产生死锁的条件以及解决方法
- (十六)java并发编程--线程的死锁解决方案(生产者和消费者几种实现方式)
- 多线程基础3-死锁、线程通信、生产者消费者模式