关于java用阻塞队列解决生产者消费者问题总结
2015-02-08 18:35
477 查看
废话不多说直接上代码:
由于阻塞队列LinkedBlockingQueue,FIFO,使用它的put(),take()会判断当前队列是有值,即等待生产再消费,即便是两个线程并行执行,很简单方便的解决了,生产者消费者问题,,但是在这里需要注意的是在两个run()方法中,打印当前生产或消费的馒头值时候,最好把put()和take();方法放在相应的打印语句中一起执行,否则会发生先消费后生产的后果。 因为打印语句和方法的执行时两段代码,由于双线程同时执行,无法保证执行的相应代码块的顺序性!!
由于最后互相等待会造成死锁,所以在主线程睡眠1秒后打断消费者,让它别等了,抛异常后return结束消费线程,最后整个main方法调用结束。
package 线程; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; public class TestBlockingQueue { static BlockingQueue <Mantu> queue=new LinkedBlockingQueue <Mantu>(6); public static void main(String[] args) throws InterruptedException { Producer3 t1 = new Producer3(); Consumer3 t2 = new Consumer3(); t1.start(); t2.start(); Thread.sleep(1000); t2.interrupt(); } } class Mantu{ int id; public Mantu(int id) { this.id=id; } @Override public String toString() { return ""+id; } } class Producer3 extends Thread{ @Override public void run() { int i=0; while(i<10){ Mantu e = new Mantu(i); try { System.out.println("生产馒头"+i); TestBlockingQueue.queue.put(e); } catch (InterruptedException e1) { System.out.println("馒头太多生产被停止了"); return; } i++; } } } class Consumer3 extends Thread{ @Override public void run() { while(true){ try { System.out.println("吃馒头"+TestBlockingQueue.queue.take()); } catch (InterruptedException e1) { System.out.println("馒头不够吃被停止了"); return; } } } }
由于阻塞队列LinkedBlockingQueue,FIFO,使用它的put(),take()会判断当前队列是有值,即等待生产再消费,即便是两个线程并行执行,很简单方便的解决了,生产者消费者问题,,但是在这里需要注意的是在两个run()方法中,打印当前生产或消费的馒头值时候,最好把put()和take();方法放在相应的打印语句中一起执行,否则会发生先消费后生产的后果。 因为打印语句和方法的执行时两段代码,由于双线程同时执行,无法保证执行的相应代码块的顺序性!!
由于最后互相等待会造成死锁,所以在主线程睡眠1秒后打断消费者,让它别等了,抛异常后return结束消费线程,最后整个main方法调用结束。
相关文章推荐
- java中使用阻塞队列解决生产者消费者问题
- 使用阻塞队列解决生产者-消费者问题
- Java多线程之生产者消费者问题<三>:使用阻塞队列更优雅地解决生产者消费者问题
- java信号量PV操作 解决生产者-消费者问题
- 关于网宿厦门研发中心笔试的一道PV操作题:利用java中的多线程实现生产者与消费者的同步问题
- java解决单缓冲生产者消费者问题示例
- Java生产者-消费者模式的阻塞队列实现
- Java多线程解决生产者和消费者问题(面向对象)
- java 生产者消费者问题 并发问题的解决(转)
- java 生产者消费者问题 并发问题的解决
- 使用阻塞队列实现生产者和消费者问题
- Java生产者-消费者模式的非阻塞队列实现
- java多线程总结六:经典生产者消费者问题实现
- java技术深入(一)——java多线程(七)——阻塞队列,生产者-消费者模式
- Java并发编程笔记 使用阻塞队列实现生产者-消费者模型
- java多线程总结六:经典生产者消费者问题实现
- Java 并发编程(四)阻塞队列和生产者-消费者模式
- Java阻塞队列BlockingQueue实现生产者消费者-只有代码-不讲原理
- 多线程(线程间通信-多生产者多消费者问题-JDK1.5解决办法-范例),停止线程,线程中方法的区别,匿名内部类实现多线程,线程总结
- java多线程解决生产者消费者问题