JAVA 生产者消费者
来源:互联网 发布:nginx 403 页面定制 编辑:程序博客网 时间:2024/05/16 12:18
1 自己实现
public class ProducerConsumer {public static void main(String[] args) {SyncStack ss=new SyncStack();Producer p=new Producer(ss);Consumer c=new Consumer(ss);new Thread(p).start();new Thread(c).start();}}class Producer implements Runnable{public SyncStack ss=null;public Producer(SyncStack ss){this.ss=ss;}public void run(){for(int i=0;i<20;i++){WoTou wt=new WoTou(i);ss.push(wt);System.out.println("生产了:"+wt);try{Thread.sleep((int)(Math.random()*1000));}catch(InterruptedException e){e.printStackTrace();}}}}class Consumer implements Runnable{public SyncStack ss=null;public Consumer(SyncStack ss){this.ss=ss;}public void run(){for(int i=0;i<20;i++){WoTou wt=ss.pop();System.out.println("消费了:"+wt);try{Thread.sleep((int)(Math.random()*1000));}catch(InterruptedException e){e.printStackTrace();}}}}class SyncStack{int index=0;WoTou[] arrWT=new WoTou[6];//对象数组public synchronized void push(WoTou wt){while(index==arrWT.length){try{this.wait();}catch(InterruptedException e){e.printStackTrace();}}this.notifyAll();arrWT[index]=wt;index++;}public synchronized WoTou pop(){while(index==0){try{this.wait();}catch(InterruptedException e){e.printStackTrace();}}this.notifyAll();index--;return arrWT[index];}}class WoTou{int id;WoTou(int id){this.id=id;}public String toString(){return "WoTou:"+id;}}
输出:
生产了:WoTou: 0
消费了:WoTou: 0
生产了:WoTou: 1
消费了:WoTou: 1
生产了:WoTou: 2
消费了:WoTou: 2
生产了:WoTou: 3
消费了:WoTou: 3
生产了:WoTou: 4
2 使用BlockingQueue
</pre><pre name="code" class="java">import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;import java.util.concurrent.LinkedBlockingQueue;class Bread{public int id;public Bread(){}public Bread(int id){this.id=id;}public String toString(){return "Bread:"+id;}}class Producer implements Runnable{ //容器 private final ArrayBlockingQueue<Bread> queue; public Producer(ArrayBlockingQueue<Bread> queue){ this.queue = queue; } @Override public void run() { while(true){ produce(); } } public void produce(){ /** * put()方法是如果容器满了的话就会把当前线程挂起 * offer()方法是容器如果满的话就会返回false,也正是我在前一篇中实现的那种策略。 */ try { for(int i=0;i<10;i++){ Bread bread = new Bread(i); queue.put(bread); System.out.println("生产了:"+bread); } } catch (InterruptedException e) { e.printStackTrace(); } } } class Consumer implements Runnable{ //容器 private final ArrayBlockingQueue<Bread> queue; public Consumer(ArrayBlockingQueue<Bread> queue){ this.queue = queue; } @Override public void run() { while(true){ consume(); } } public void consume(){ /** * take()方法和put()方法是对应的,从中拿一个数据,如果拿不到线程挂起 * poll()方法和offer()方法是对应的,从中拿一个数据,如果没有直接返回null */ try { for(int i=0;i<10;i++){ Bread bread = queue.take(); System.out.println("消费了:"+bread); } } catch (InterruptedException e) { e.printStackTrace(); } } } public class TestBlockingQueue { public static void main(String[] args) { int capacity = 10; ArrayBlockingQueue<Bread> queue = new ArrayBlockingQueue<Bread>(capacity); new Thread(new Producer(queue)).start(); new Thread(new Producer(queue)).start(); new Thread(new Consumer(queue)).start(); new Thread(new Consumer(queue)).start(); new Thread(new Consumer(queue)).start(); } }输出:
消费了:Bread: 1
消费了:Bread: 2
消费了:Bread: 3
消费了:Bread: 4
消费了:Bread: 0
消费了:Bread: 5
消费了:Bread: 3
消费了:Bread: 2
生产了:Bread: 5
生产了:Bread: 0
生产了:Bread: 1
生产了:Bread: 2
生产了:Bread: 3
生产了:Bread: 4
生产了:Bread: 5
0 0
- java多线程 消费者-生产者
- java生产者 消费者问题
- java生产者消费者
- java生产者消费者
- Java生产者消费者问题
- java多线程 消费者-生产者
- java生产者消费者问题
- java 多线程 生产者消费者
- JAVA [ 多线程 -- 生产者消费者 ]
- Java 生产者消费者问题
- java 生产者消费者问题
- java 生产者和消费者
- Java生产者消费者问题 .
- [Java] 生产者&消费者问题
- Java生产者消费者代码
- java 生产者与消费者
- Java 生产者消费者问题
- 生产者消费者java实现
- [JavaScript]input框输入数据后下面筛选提示数据----封装inputselect.js
- NVIDIA GPU 2016
- spring中FileSystemXmlApplicationContext和ClassPathXmlApplicationContext的类图
- 易语言逆向分析1
- Java单例模式的应用示例
- JAVA 生产者消费者
- cadence16.5与allegro无法交互
- Python内建函数:filter
- 走遍中国 —— 大西南
- Android配置文件权限一览表
- oracle11g 参数调整优化 Cursor_sharing
- 跨域以及实验室项目的一些问题
- UIButton在设置不能交互的情况下如何让背景图片显示正常颜色。
- AngularJS