JAVA多线程(五)用lock、synchronized、阻塞队列三种方法实现生产者消费者模式
来源:互联网 发布:天猫和淘宝价格对比 编辑:程序博客网 时间:2024/04/30 15:55
这篇博客算是上一篇JAVA多线程(三)生产者消费者模式及实现方法的补充。用三种方法(lock、synchronized、阻塞队列)实现生产者消费者模式。具体内容是:生产者产生随机数(为了方便阅读结果,我把随机数限定在10以内的整数),消费者读取并打印。
1 阻塞队列实现生产者消费者模式
阻塞队列是最简单的实现方法
import java.util.concurrent.BlockingQueue;import java.util.concurrent.LinkedBlockingQueue;import java.util.logging.Level;import java.util.logging.Logger;import java.util.Random;public class BlockingQueuePattern { public static void main(String args[]){ //阻塞队列 BlockingQueue sharedQueue = new LinkedBlockingQueue(); //创建生产者线程和消费者线程 Thread prodThread = new Thread(new Producer(sharedQueue)); Thread consThread = new Thread(new Consumer(sharedQueue)); //启动生产者线程和消费者线程 prodThread.start(); consThread.start(); }}//生产者类class Producer implements Runnable { private final BlockingQueue sharedQueue; public Producer(BlockingQueue sharedQueue) { this.sharedQueue = sharedQueue; } @Override public void run() { for(int i=0; i<10; i++){ try { //产生10以内的随机整数放入阻塞队列 Random random = new Random(); int ProdRandom=random.nextInt(10); System.out.println("Produced: " + ProdRandom); sharedQueue.put(ProdRandom); } catch (InterruptedException ex) { Logger.getLogger(Producer.class.getName()).log(Level.SEVERE, null, ex); } } }}//消费者类class Consumer implements Runnable{ private final BlockingQueue sharedQueue; public Consumer (BlockingQueue sharedQueue) { this.sharedQueue = sharedQueue; } @Override public void run() { while(true){ try { System.out.println("Consumed: "+ sharedQueue.take()); } catch (InterruptedException ex) { Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, ex); } } }} Output:Produced: 4Produced: 7Produced: 8Consumed: 4Consumed: 7Produced: 6Consumed: 8Consumed: 6Produced: 1Produced: 7Consumed: 1Consumed: 7Produced: 3Produced: 5Consumed: 3Consumed: 5Produced: 9Produced: 7Consumed: 9Consumed: 7
2 lock实现生产者消费者模式
既然不用JAVA提供给我们的现成的阻塞队列,我们不如自己创建一个队列,代码如下:
import java.util.LinkedList;import java.util.Random;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class OptimisticLockPattern { public static void main(String[] args){ SelfQueue selfqueue = new SelfQueue(); //创建生产者线程和消费者线程 Thread prodThread = new Thread(new Producer(selfqueue)); Thread consThread = new Thread(new Consumer(selfqueue)); //启动生产者线程和消费者线程 prodThread.start(); consThread.start(); }}class SelfQueue{ int max = 5; LinkedList<Integer> ProdLine = new LinkedList<Integer>(); Lock lock = new ReentrantLock(); Condition full = lock.newCondition(); Condition empty = lock.newCondition(); public void produce(int ProdRandom){ try { lock.lock(); while(max == ProdLine.size()){ System.out.println("存储量达到上限,请等待"); full.await(); } ProdLine.add(ProdRandom); empty.signal(); } catch (InterruptedException e) { e.printStackTrace(); }finally{ lock.unlock(); } } public int consume(){ int m = 0; try { lock.lock(); while(ProdLine.size() == 0){ System.out.println("队列是空的,请稍候"); empty.await(); } m = ProdLine.removeFirst(); full.signal(); } catch (InterruptedException e) { e.printStackTrace(); }finally{ lock.unlock(); return m; } }}//生产者class Producer implements Runnable{ private final SelfQueue selfqueue; public Producer(SelfQueue selfqueue) { this.selfqueue = selfqueue; } public void run() { for (int i = 0; i < 10; i++) { Random random = new Random(); int ProdRandom=random.nextInt(10); System.out.println("Produced: " + ProdRandom); selfqueue.produce(ProdRandom); } }}//消费者class Consumer implements Runnable{ private final SelfQueue selfqueue; public Consumer(SelfQueue selfqueue) { this.selfqueue = selfqueue; } public void run() { while(true) { System.out.println("Consumed: "+ selfqueue.consume()); } }}Output:Produced: 1Produced: 9Consumed: 1Consumed: 9队列是空的,请稍候Produced: 9Produced: 1Consumed: 9Produced: 8Consumed: 1Consumed: 8队列是空的,请稍候Produced: 6Produced: 8Consumed: 6Produced: 4Consumed: 8Produced: 4Consumed: 4Produced: 0Consumed: 4Consumed: 0队列是空的,请稍候
3 synchronized实现生产者消费者模式
synchronized不需要自己手动解锁,这里用到了前面提过的wait()¬ify()方法。
import java.util.Random;public class PessimisticLockPattern { public static void main(String[] args){ SelfQueue selfqueue = new SelfQueue(); //创建生产者线程和消费者线程 Thread prodThread = new Thread(new Producer(selfqueue)); Thread consThread = new Thread(new Consumer(selfqueue)); //启动生产者线程和消费者线程 prodThread.start(); consThread.start(); }}class SelfQueue{ int index = 0; int[] ProdLine = new int[6]; public synchronized void produce(int ProdRandom){ while(index == ProdLine.length){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.notify(); ProdLine[index] = ProdRandom; index++; } public synchronized int consume(){ while(index == 0){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.notify(); index--; return ProdLine[index]; }}//生产者class Producer implements Runnable{ private final SelfQueue selfqueue; public Producer(SelfQueue selfqueue) { this.selfqueue = selfqueue; } public void run() { for (int i = 0; i < 10; i++) { Random random = new Random(); int ProdRandom = random.nextInt(10); System.out.println("Produced: " + ProdRandom); selfqueue.produce(ProdRandom); }}}//消费者class Consumer implements Runnable{ private final SelfQueue selfqueue; public Consumer(SelfQueue selfqueue) { this.selfqueue = selfqueue; } public void run() { while(true) { System.out.println("Consumed: "+ selfqueue.consume()); }}}Output:Produced: 3Produced: 3Consumed: 3Produced: 8Produced: 3Consumed: 3Produced: 2Produced: 6Consumed: 3Produced: 7Produced: 8Produced: 1Produced: 9Consumed: 6Consumed: 9Consumed: 1Consumed: 8Consumed: 7Consumed: 2Consumed: 8
1 0
- JAVA多线程(五)用lock、synchronized、阻塞队列三种方法实现生产者消费者模式
- JAVA多线程(三)生产者消费者模式及实现方法
- 生产者-消费者模式(阻塞队列实现)
- Java 多线程 (PART XVIII) Lock(II)用lock实现生产者消费者模式
- 消费者生产者模式(2)——用java阻塞队列实现
- Java生产者-消费者模式的非阻塞队列实现
- Java生产者-消费者模式的阻塞队列实现
- JAVA 阻塞队列实现 生产者和消费者 模式
- java使用阻塞队列实现生产者消费者模式
- Java并发编程:阻塞队列及实现生产者-消费者模式
- 阻塞队列实现生产者消费者模式
- 阻塞队列---实现生产者消费者模式
- 阻塞队列实现生产者消费者模式
- 阻塞队列实现生产者消费者模式
- 阻塞队列实现生产者消费者模式
- 阻塞队列实现生产者消费者模式
- 阻塞队列实现生产者消费者模式
- 阻塞队列实现的生产者/消费者模式
- 大力推荐的超牛GitHub top 100的Java开源库
- 根据本地文件,生成百度云文件列表
- js获取ip地址
- Android 使用addview生成列表,界面切换时将指定的行数滚动到列表的第一行
- LA2995
- JAVA多线程(五)用lock、synchronized、阻塞队列三种方法实现生产者消费者模式
- C#中重新定义Console实现自动保存输出到文件
- Android Studio 2.1.1 更换主题 代码样式
- HDU 1075.What Are You Talking About【Map水题(字典树)】【5月25】
- Android 6.0 ConfirmCredential
- 实时人脸检测 (Real-Time Face Detection)
- 阿里云上CentOS6.5部署Django+nginx+uwsgi
- android 蓝牙编程重点---如何发送和接收16进制数据
- 网站锚点执行平滑滚动