3.1.11生产者消费者(n:n)
来源:互联网 发布:java的职业规划 编辑:程序博客网 时间:2024/06/05 20:45
package demo;import java.util.ArrayList;import java.util.List;/** * Created by sunyifeng on 17/10/16. */public class MyStack { private List list = new ArrayList(); synchronized public void push() { try { while (list.size() == 1) { this.wait(); } list.add("sunyf=" + Math.random()); this.notifyAll(); System.out.println("push=" + list.size()); } catch (InterruptedException e) { e.printStackTrace(); } } synchronized public String pop() { String returnValue = ""; try { while (list.size() == 0) { System.out.println("pop操作中的:" + Thread.currentThread().getName() + "线程是wait状态"); this.wait(); } returnValue = "" + list.get(0); list.remove(0); this.notifyAll(); System.out.println("pop=" + list.size()); } catch (InterruptedException e) { e.printStackTrace(); } return returnValue; }}
package demo;/** * Created by sunyifeng on 17/10/16. */public class P { private MyStack myStack; public P(MyStack myStack) { super(); this.myStack = myStack; } public void pushService(){ myStack.push(); }}
package demo;/** * Created by sunyifeng on 17/10/16. */public class C { private MyStack myStack; public C(MyStack myStack) { super(); this.myStack = myStack; } public void popService(){ System.out.println("pop=" + myStack.pop()); }}
package demo;/** * Created by sunyifeng on 17/10/16. */public class ThreadP extends Thread { private P p; public ThreadP(P p) { super(); this.p = p; } @Override public void run(){ while (true) { p.pushService(); } }}
package demo;/** * Created by sunyifeng on 17/10/16. */public class ThreadC extends Thread { private C c; public ThreadC(C c) { super(); this.c = c; } @Override public void run(){ while (true) { c.popService(); } }}
package demo;/** * Created by sunyifeng on 17/10/16. */public class Run { public static void main(String[] args) { MyStack myStack = new MyStack(); P p1 = new P(myStack); P p2 = new P(myStack); P p3 = new P(myStack); P p4 = new P(myStack); P p5 = new P(myStack); P p6 = new P(myStack); ThreadP threadP1 = new ThreadP(p1); ThreadP threadP2 = new ThreadP(p2); ThreadP threadP3 = new ThreadP(p3); ThreadP threadP4 = new ThreadP(p4); ThreadP threadP5 = new ThreadP(p5); ThreadP threadP6 = new ThreadP(p5); threadP1.start(); threadP2.start(); threadP3.start(); threadP4.start(); threadP5.start(); threadP6.start(); // C c1 = new C(myStack); C c2 = new C(myStack); C c3 = new C(myStack); C c4 = new C(myStack); C c5 = new C(myStack); C c6 = new C(myStack); C c7 = new C(myStack); C c8 = new C(myStack); ThreadC threadC1 = new ThreadC(c1); ThreadC threadC2 = new ThreadC(c2); ThreadC threadC3 = new ThreadC(c3); ThreadC threadC4 = new ThreadC(c4); ThreadC threadC5 = new ThreadC(c5); ThreadC threadC6 = new ThreadC(c5); ThreadC threadC7 = new ThreadC(c5); ThreadC threadC8 = new ThreadC(c5); threadC1.start(); threadC2.start(); threadC3.start(); threadC4.start(); threadC5.start(); threadC6.start(); threadC7.start(); threadC8.start(); }}
运行结果:push=1
pop=0
pop=sunyf=0.00672334326936852
pop操作中的:Thread-6线程是wait状态
pop操作中的:Thread-11线程是wait状态
pop操作中的:Thread-8线程是wait状态
pop操作中的:Thread-13线程是wait状态
pop操作中的:Thread-12线程是wait状态
pop操作中的:Thread-10线程是wait状态
pop操作中的:Thread-9线程是wait状态
pop操作中的:Thread-7线程是wait状态
push=1
pop=0
pop=sunyf=0.9209681161168464
pop操作中的:Thread-7线程是wait状态
pop操作中的:Thread-9线程是wait状态
pop操作中的:Thread-10线程是wait状态
pop操作中的:Thread-12线程是wait状态
pop操作中的:Thread-13线程是wait状态
pop操作中的:Thread-8线程是wait状态
pop操作中的:Thread-11线程是wait状态
pop操作中的:Thread-6线程是wait状态
push=1
结果说明:
1、list对象size没有超过1。
2、notifyAll不会造成假死。
阅读全文
0 0
- 3.1.11生产者消费者(n:n)
- 生产者和消费者信号灯实现 N-1
- 多线程编程 之 (生产者与消费者(N多))同步常用的方法。
- 3.1.11生产者消费者模式(假死)
- 信号量 进程 (m个生产者,n个消费者,容量为r的缓冲区)
- m个生产者和n个消费者和x个搬运者的java实现
- 3.1.11生产者消费者模式(1:1)
- 3.1.11生产者消费者(栈的实现)
- c++11生产者消费者
- Boost, C++11,生产者消费者以及Qt生产者消费者例子
- 生产者/消费者模式 (一)“生产者/消费者模式”介绍
- c++11版生产者-消费者
- C++11之生产者消费者
- 生产者与消费者(C#)
- 生产者消费者问题(信号量)
- 线程(消费者与生产者)
- 线程(生产者消费者问题)
- 生产者-消费者问题(操作系统)
- R_条件分割图
- Kubernetes集群中部署Node节点
- 谷歌面试题(一)
- httpclient使用实例
- Docker学习系列(一):windows下安装docker
- 3.1.11生产者消费者(n:n)
- C++笔记——动态内存分配
- 谷歌面试题(2)
- JSP学习笔记
- R_等高图
- 2017-10-15离线赛
- 简单筛法判断两整数间的素数
- updateByPrimaryKey和updateByPrimaryKeySelective insert和insertSelective
- App安全增强——我来帮你写C++