生产者与消费者-1:N-基于list
2018-09-01 05:41:29来源:博客园 阅读 ()
一个生产者/多个消费者:
1 /** 2 * 生产者 3 */ 4 public class P { 5 6 private MyStack stack; 7 8 public P(MyStack stack) { 9 this.stack = stack; 10 } 11 12 public void pushService() { 13 stack.push(); 14 } 15 }
1 /** 2 * 消费者 3 */ 4 public class C { 5 6 private MyStack stack; 7 8 public C(MyStack stack) { 9 this.stack = stack; 10 } 11 12 public void popService() { 13 System.out.println("pop = " + stack.pop()); 14 } 15 }
1 /** 2 * 模拟栈 3 */ 4 public class MyStack { 5 6 private List<Object> list = new ArrayList<>(); 7 8 public synchronized void push() { 9 try { 10 while(list.size() == 1) { 11 this.wait(); 12 } 13 list.add(""+Math.random()); 14 this.notifyAll(); 15 System.out.println("push:" + list.size()); 16 } catch (InterruptedException e) { 17 e.printStackTrace(); 18 } 19 } 20 21 public synchronized String pop() { 22 String value = ""; 23 try { 24 while(list.size() == 0) { 25 System.out.println("pop 操作中:" + Thread.currentThread().getName() + "wait状态"); 26 this.wait(); 27 } 28 value = ""+list.get(0); 29 list.remove(0); 30 this.notifyAll(); 31 System.out.println("pop:" + list.size()); 32 } catch (InterruptedException e) { 33 e.printStackTrace(); 34 } 35 return value; 36 } 37 }
1 /** 2 * 生产者线程 3 */ 4 public class P_Thread extends Thread { 5 6 private P p; 7 8 public P_Thread(P p) { 9 this.p = p; 10 } 11 12 @Override 13 public void run() { 14 while (true) { 15 p.pushService(); 16 } 17 } 18 }
1 /** 2 * 消费者线程 3 */ 4 public class C_Thread extends Thread { 5 6 private C c; 7 8 public C_Thread(C c) { 9 this.c = c; 10 } 11 12 @Override 13 public void run() { 14 while (true) { 15 c.popService(); 16 } 17 } 18 }
1 /** 2 * 测试类 3 */ 4 public class Run { 5 6 public static void main(String[] args) { 7 MyStack stack = new MyStack(); 8 //一个生产者 9 P p = new P(stack); 10 //多个消费者 11 C c1 = new C(stack); 12 C c2 = new C(stack); 13 C c3 = new C(stack); 14 15 //一个生产者线程 16 P_Thread pThread = new P_Thread(p); 17 //多个消费者线程 18 C_Thread cThread1 = new C_Thread(c1); 19 C_Thread cThread2 = new C_Thread(c2); 20 C_Thread cThread3 = new C_Thread(c3); 21 22 //启动 23 pThread.start(); 24 cThread1.start(); 25 cThread2.start(); 26 cThread3.start(); 27 } 28 }
运行结果如下:
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:JVM内存布局
- 多线程:生产者消费者(管程法、信号灯法) 2020-06-01
- 基于数据库的代码自动生成工具,生成JavaBean、生成数据库文 2020-05-31
- 数据分析 | 基于智能标签,精准管理数据 2020-05-30
- 不用找了,基于 Redis 的分布式锁实战来了! 2020-05-26
- Spring02_基于XML的IOC 2020-05-24
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash