await/signal/lock实现生产消费者模式
来源:互联网 发布:alpine python 编辑:程序博客网 时间:2024/06/18 17:15
存储类GoodStorage:
package main.wll.fish.product;import java.util.ArrayList;import java.util.List;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class GoodStorage {private static final int SIZE = 2;private List<Good> storage = new ArrayList<Good>(SIZE);// 锁private final Lock lock = new ReentrantLock();// 仓库满的条件变量private final Condition full = lock.newCondition();// 仓库空的条件变量private final Condition empty = lock.newCondition();public void add(Good good) {lock.lock();{while (storage.size() >= SIZE) {try {System.out.println(Thread.currentThread().getName() + "------>product wait.... now ListSIze:"+ storage.size());full.await();} catch (InterruptedException e) {e.printStackTrace();}}storage.add(good);System.out.println(Thread.currentThread().getName() + "------>product :" + good.toString()+ ", now ListSIze:" + storage.size());empty.signalAll();}lock.unlock();}public void remove() {lock.lock();{while (storage.size() == 0) {try {System.out.println(Thread.currentThread().getName() + "------>consume wait.... now ListSIze:"+ storage.size());empty.await();} catch (InterruptedException e) {e.printStackTrace();}}Good good = storage.get(0);storage.remove(0);System.out.println(Thread.currentThread().getName() + "------------------------------------>consume :"+ good.toString() + ", now ListSIze:" + storage.size());full.signalAll();}lock.unlock();}}class Good {public long id;public Good(long id) {this.id = id;}public String toString() {return String.format("Good-%d", this.id);}}
生产者:
- import java.util.Random;
- import java.util.concurrent.atomic.AtomicInteger;
- class Producter implements Runnable {
- private static AtomicInteger ato = new AtomicInteger(0);
- private GoodStorage store;
- public Producter(GoodStorage store ){
- this.store = store;
- }
- public void run() {
- while(true){
- try {
- Thread.currentThread().sleep(new Random().nextInt(1000));
- // queue.put(new Good(System.currentTimeMillis()));
- store.add(new Good(ato.incrementAndGet()));
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
消费者:
- import java.util.Random;
- class Consumer implements Runnable {
- private GoodStorage store;
- public Consumer(GoodStorage store ){
- this.store = store;
- }
- public void run() {
- while(true){
- try {
- Thread.currentThread().sleep(new Random().nextInt(1000));
- store.remove();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
运行主类:
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- public class Main {
- static ExecutorService pool = Executors.newCachedThreadPool();
- public static void main(String[] args) {
- GoodStorage store = new GoodStorage();
- pool.execute(new Producter(store));
- pool.execute(new Producter(store));
- pool.execute(new Producter(store));
- pool.execute(new Consumer(store));
- pool.execute(new Consumer(store));
- }
- }
运行结果:
pool-1-thread-8------>product wait.... now ListSIze:2pool-1-thread-12------>product wait.... now ListSIze:2pool-1-thread-1------>product wait.... now ListSIze:2pool-1-thread-7------>product wait.... now ListSIze:2pool-1-thread-13------>product wait.... now ListSIze:2pool-1-thread-9------>product wait.... now ListSIze:2pool-1-thread-17------>product wait.... now ListSIze:2pool-1-thread-16------>product wait.... now ListSIze:2pool-1-thread-5------>product wait.... now ListSIze:2pool-1-thread-20------------------------------------>consume :Good-34532, now ListSIze:1pool-1-thread-20------------------------------------>consume :Good-34533, now ListSIze:0pool-1-thread-20------>consume wait.... now ListSIze:0pool-1-thread-21------>consume wait.... now ListSIze:0pool-1-thread-6------>product :Good-34534, now ListSIze:1pool-1-thread-6------>product :Good-34535, now ListSIze:2pool-1-thread-6------>product wait.... now ListSIze:2pool-1-thread-10------>product wait.... now ListSIze:2pool-1-thread-2------>product wait.... now ListSIze:2pool-1-thread-14------>product wait.... now ListSIze:2pool-1-thread-18------>product wait.... now ListSIze:2pool-1-thread-3------>product wait.... now ListSIze:2pool-1-thread-11------>product wait.... now ListSIze:2pool-1-thread-15------>product wait.... now ListSIze:2pool-1-thread-19------>product wait.... now ListSIze:2pool-1-thread-4------>product wait.... now ListSIze:2pool-1-thread-8------>product wait.... now ListSIze:2pool-1-thread-12------>product wait.... now ListSIze:2pool-1-thread-1------>product wait.... now ListSIze:2pool-1-thread-7------>product wait.... now ListSIze:2pool-1-thread-13------>product wait.... now ListSIze:2pool-1-thread-9------>product wait.... now ListSIze:2pool-1-thread-17------>product wait.... now ListSIze:2pool-1-thread-16------>product wait.... now ListSIze:2pool-1-thread-5------>product wait.... now ListSIze:2pool-1-thread-20------------------------------------>consume :Good-34534, now ListSIze:1pool-1-thread-20------------------------------------>consume :Good-34535, now ListSIze:0pool-1-thread-20------>consume wait.... now ListSIze:0pool-1-thread-21------>consume wait.... now ListSIze:0
0 0
- await/signal/lock实现生产消费者模式
- java使用BlockingQueue实现生产消费者模式
- wait/notify实现生产消费者模式
- 非阻塞队列实现生产消费者模式
- java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)
- Lock,Condition实现请求者-消费者模式
- 生产消费者模式
- 生产消费者模式
- 生产消费者模式
- 生产消费者模式
- 消费者生产模式
- 生产、消费者模式
- 生产、消费者模式
- 生产消费者模式
- 生产消费者模式
- java生产消费者模式
- 生产消费者模式
- 生产消费者模型实现
- java.lang.NullPointerException:
- LoadRunner录制脚本,报连接不到服务器的提示信息 :Request Connection: Remote Serve
- ASP.NET-MVC4--Layout母版页面传入数据Model模型
- ThreadLocal理解与使用
- python中进程通信之signal信号
- await/signal/lock实现生产消费者模式
- Activity调用isDestroyed()方法报出,java.lang.NoSuchMethodError
- js获取当前域名、Url、相对路径和参数
- java代码--登录窗口
- 机房收费系统总结之一BOF和EOF
- ThinkPHP3.2 点击看不清刷新验证码
- 对概念性架构设计的理解杂记(优秀)
- view not attached to windows manager与This Toast was not created with Toast.makeText()
- 慎用mysql的join语句和in子查询语句,普通查询可能是最好的优化