多个线程执行多个任务,解决该问题的死锁问题
来源:互联网 发布:纳网科技域名续缴费 编辑:程序博客网 时间:2024/04/30 10:32
之前我们说过的生产者消费者问题,当然是最简单的那种
/*一个生产线程,一个消费线程,程序不存在安全问题两个生产线程,两个消费线程,出现了生产两次,消费一次或生产一次消费两次的问题出现问题的原因是:线程被唤醒之后没有回去判断标记,直接执行后边的代码解决方式: 让线程被唤醒之后不是直接执行后边的代码,而是回去判断标记 把if改成while 把if改成while出现了死锁:原因是唤醒的是本方线程,导致所有线程全部等待 notify唤醒的是任意一个线程,不能保证唤醒的是对方线程 解决方式:把notify()改为notifyAll()*/
代码演示的是正确的打开方式
//描述产品class Product{ private String name; private int count; private boolean flag; //生产产品的功能 public synchronized void produce(String name) { while(flag) { try{wait();}catch(InterruptedException e){e.printStackTrace();} } this.name = name+"..."+count; System.out.println(Thread.currentThread().getName()+"生产了....."+this.name); count++; flag = true; notifyAll(); } //消费产品的功能 public synchronized void consume() { while(!flag) { try{wait();}catch(InterruptedException e){e.printStackTrace();} } System.out.println(Thread.currentThread().getName()+"......消费了....."+name); flag = false; notifyAll(); }}//生产任务class Producer implements Runnable{ private Product pro; public Producer(Product pro) { this.pro =pro; } public void run() { while(true) { pro.produce("笔记本"); } }}//消费任务class Consumer implements Runnable{ private Product pro; public Consumer(Product pro) { this.pro =pro; } public void run() { while(true) { pro.consume(); } }}class Demo3 { public static void main(String[] args) { Product pro = new Product(); Producer producer =new Producer(pro); Consumer consumer = new Consumer(pro); Thread t0 = new Thread(producer); Thread t1 = new Thread(producer); Thread t2 = new Thread(consumer); Thread t3 = new Thread(consumer); t0.start(); t1.start(); t2.start(); t3.start(); }}
我们为了解决因为wait()而导致的死锁,我们选择唤醒所有进程,但是这种方法很低效,影响代码执行效率。
在下面的文章我们选择显示锁来解决这个问题。
0 0
- 多个线程执行多个任务,解决该问题的死锁问题
- Quartz框架多个trigger任务执行出现漏执行的问题分析
- 关于多个异步任务线程如何取消上一个线程的问题
- 一个线程执行多个任务,要按照顺序执行
- 同一实例的多个线程问题
- 问题发个任务看完该户口问题
- iphone开发——同时新建多个线程不执行的问题
- 用一个线程池执行多个任务
- Java线程池并发执行多个任务
- 同时执行多个$.getJSON() 数据混乱的问题的解决
- ODI错误解决_多个任务执行错误
- gulp执行多个任务
- 线程死锁 解决共享资源问题
- Java多线程——获取多个线程任务执行完的时间
- 线程死锁的问题
- GCD之阻塞死锁问题以及多个图片下载优化
- 多个AJAX执行顺序问题
- oracle 一次执行多个sql的问题
- JavaWeb学习篇之----Servlet过滤器Filter和监听器
- chapter2、操作系统简介
- hdu 1814
- BSGS(a^x%p=b)
- 关于计算几何
- 多个线程执行多个任务,解决该问题的死锁问题
- Ubuntu下Crtmp服务器的搭建及过程中遇到的问题解决方法
- xml四种解析技术 简述 优缺点
- 一台机器上安装两个tomcat
- NandFlash和NorFlash的区别
- 【JZOJ 4710】Value
- 【docker】docker在ubuntu中的安装与部署
- Unity中使用ulua的个人经验总结
- 杂记1:android广播监听实时监听网络,以及回调机制应用