package com.tom; import java.util.LinkedList; import java.util.Queue; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class Plate<T> { private final Lock lock = new ReentrantLock(); private final Condition PLATE_NOT_FULL = lock.newCondition(); private final Condition PLATE_NOT_EMPTY = lock.newCondition(); private final Queue<T> plates = new LinkedList<T>(); private int size; public Plate(int size) { this.size = size; } public void produce(T fruit) { lock.lock(); try { if (plates.size() >= size) { try { System.out.println(Thread.currentThread().getName() + ", The plate is full..waiting to put into the plate"); PLATE_NOT_FULL.await(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName() + ", The plate is not full..put the fruit into the plate: " + fruit); plates.offer(fruit); PLATE_NOT_EMPTY.signalAll(); } finally { if (lock != null){ lock.unlock(); } } } public T consume() { T fruit = null; lock.lock(); try { if (plates.isEmpty()) { try { System.out.println(Thread.currentThread().getName() + ", The plate is empty..waiting to consume"); PLATE_NOT_EMPTY.await(); } catch (InterruptedException e) { e.printStackTrace(); } } fruit = plates.poll(); System.out.println(Thread.currentThread().getName() + ",The plate is not empty, consume the fruit: " + fruit); PLATE_NOT_FULL.signalAll(); } finally { if (lock != null){ lock.unlock(); } } return fruit; } } public class ThreadCommunication { private static volatile boolean shutdown = false; public static void main(String[] args) { final Plate<Integer> plate = new Plate<Integer>(8); Thread[] consumers = new Thread[3]; for (int i = 0; i < consumers.length; i++) { consumers[i] = new Thread() { @Override public void run() { while (!shutdown) { plate.consume(); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } } }; consumers[i].start(); } Thread[] producers = new Thread[2]; for (int i = 0; i < producers.length; i++) { producers[i] = new Thread() { @Override public void run() { while (!shutdown) { plate.produce(ThreadLocalRandom.current().nextInt(100, 1000)); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }; producers[i].start(); } try { Thread.sleep(6000); shutdown = true; } catch (InterruptedException e) { e.printStackTrace(); } } }
相关推荐
java多线程实现生产者和消费者
java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型...
编写一个“生产者-消费者”的多线程演示程序,两个生产者,一个消费者,可以存放产品的仓库容量为10,仓库用栈实现,并有同步功能,且能防止先消费后生产的情况。
本代码是用JAVA实现的生产者与消费者的问题,线程间的同步与互斥功能
用java多线程,实现生产者消费者同步和互斥的问题,操作系统中的经典问题
a: 创建一个线程 ...h: problem1 生产者消费者问题 (1生产者 1消费者 1缓冲区) problem1 more 生产者消费者问题 (1生产者 2消费者 4缓冲区) problem2 读者与写着问题 I: 信号量 semaphore 解决线程同步问题
java多线程实现生产者消费者关系,完成线程之间的同步。
由生产者/消费者问题看JAVA多线程,让我们更加的了解多线程问题
java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现...
生产者消费者模式是java多线程经典的安全,它用到了同步,资源共享,wait,notify等技术。
java多线程学习,生产者消费者问题示例
用java多线程简易实现生产者消费者模式的代码,用java多线程简易实现生产者消费者模式的代码。
基本满足操作系统课上要求,java实现的生产者消费者模型。
本文通过多线程方法解决了生产者与消费者之间同步的问题
java 多线程生产者消费者模型demo
java 多线程 生产者消费者模式,你值得拥有
操作系统 用多线程同步方法解决生产者-消费者问题 课设报告
Java多线程--生产者与消费者问题
关于java多线程的东西,里面有生产者与消费者的案例,感兴趣的朋友看一下吧。