分为三种方式实现,具体见代码注释:
package beijing.lele; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class ProduceConsumeMoreThread { /** * 使用 Lock + Condition类 实现 * 在使用 第一种方式的notifyAll中,由于notifyAll唤醒的是己方和对方线程,优化的是只唤醒对方进程 * */ public static void main(String[] args) { //Resources rource =new Resources(); 使用 notifyAll方式 实现多生产多消费 //ResourcesCondition rource =new ResourcesCondition(); 使用 Lock Condition方式 ResourcesConditionMore rource =new ResourcesConditionMore(); // 使用改进版 Lock Condition方式 ProductorMore pro = new ProductorMore(rource); ConsumerMore con = new ConsumerMore(rource); Thread t1 =new Thread(pro,"张大厨"); Thread t2 =new Thread(pro,"李大厨");//多个生产者 Thread t3 =new Thread(con,"学生甲"); Thread t4 =new Thread(con,"学生乙");//多个消费者 t1.start(); t2.start(); t3.start(); t4.start(); System.out.println("Hello World!"); } } class ConsumerMore implements Runnable { private Resources res; private ResourcesCondition res1; private ResourcesConditionMore res2; ConsumerMore(Resources res){ this.res =res; } ConsumerMore(ResourcesCondition res1){ this.res1 =res1; } ConsumerMore(ResourcesConditionMore res){ this.res2 =res; } public void run(){ while(true){ //res.out(); //res1.out(); res2.out(); } } } class ProductorMore implements Runnable { private Resources res; private ResourcesCondition res1 ; ResourcesConditionMore res2; ProductorMore(Resources res){ this.res =res; } ProductorMore(ResourcesCondition res){ this.res1 =res; } ProductorMore(ResourcesConditionMore res){ this.res2 =res; } public void run(){ while(true){ //res.set("++商品++"); //res1.set("++商品++"); res2.set("++商品++"); } } } /** 这是这一版的跑的结果,可以看到 即使在 消费时长 张大厨生产者++商品++--1 学生甲 ....消费者....++商品++--1 张大厨生产者++商品++--2 学生甲 ....消费者....++商品++--2 张大厨生产者++商品++--3 学生甲 ....消费者....++商品++--3 张大厨生产者++商品++--4 学生乙 ....消费者....++商品++--4 张大厨生产者++商品++--5 学生乙 ....消费者....++商品++--5 张大厨生产者++商品++--6 学生乙 ....消费者....++商品++--6 张大厨生产者++商品++--7 学生乙 ....消费者....++商品++--7 张大厨生产者++商品++--8 学生乙 ....消费者....++商品++--8 张大厨生产者++商品++--9 学生乙 ....消费者....++商品++--9 张大厨生产者++商品++--10 学生乙 ....消费者....++商品++--10 张大厨生产者++商品++--11 学生甲 ....消费者....++商品++--11 张大厨生产者++商品++--12 学生甲 ....消费者....++商品++--12 李大厨生产者++商品++--13 学生甲 ....消费者....++商品++--13 李大厨生产者++商品++--14 学生甲 ....消费者....++商品++--14 * @author Administrator * */ class ResourcesCondition { private String name; private int count =1; private boolean flag =false; private Lock lock = new ReentrantLock(); // 替代 synchronized的并提供更强大的功能 private Condition condition = lock.newCondition(); public void set(String name) { lock.lock(); try { while(flag) { condition.await(); } Thread.sleep(200); this.name = name+"--"+count++; System.out.println(Thread.currentThread().getName()+"生产者"+this.name); flag = true; condition.signalAll(); // 唤醒 } catch (InterruptedException e1) { e1.printStackTrace(); }finally { lock.unlock(); } } public synchronized void out() { lock.lock(); try{ //1)循环判断 while(!flag){ condition.await(); } Thread.sleep(600); System.out.println(Thread.currentThread().getName()+" ....消费者...."+this.name); flag =false; condition.signalAll(); } catch (InterruptedException e) { e.printStackTrace(); }// 模拟消费耗时 finally { lock.unlock(); } } } class ResourcesConditionMore { private String name; private int count =1; private boolean flag =false; private Lock lock = new ReentrantLock(); private Condition condition_pro = lock.newCondition();// 使用Lock建立生产者的condition对象 private Condition condition_consume = lock.newCondition();// 使用Lock建立消费者的condition对象 public void set(String name) { lock.lock(); try { while(flag) { condition_pro.await(); } Thread.sleep(200); this.name = name+"--"+count++; System.out.println(Thread.currentThread().getName()+"生产者"+this.name); flag = true; condition_consume.signal(); // 生产者生产完毕后,唤醒消费者的进程(不再是signalAll) } catch (InterruptedException e1) { e1.printStackTrace(); }finally { lock.unlock(); } } public synchronized void out() { lock.lock(); try{ //1)循环判断 while(!flag){ condition_consume.await(); } Thread.sleep(600); System.out.println(Thread.currentThread().getName()+" ....消费者...."+this.name); flag =false; condition_pro.signal(); // 消费者消费完毕后,唤醒生产者的进程 } catch (InterruptedException e) { e.printStackTrace(); }// 模拟消费耗时 finally { lock.unlock(); } } } class Resources { private String name; private int count =1; private boolean flag =false; public synchronized void set(String name) { //1)循环判断 while(flag) try{this.wait();}catch(Exception e){} this.name = name+"--"+count++; try { Thread.sleep(200) ; } catch (InterruptedException e) { e.printStackTrace(); }// 模拟生产耗时 System.out.println(Thread.currentThread().getName()+"生产者"+this.name); flag =true; //2)唤醒所有进程 this.notifyAll(); } public synchronized void out() { //1)循环判断 while(!flag) try{this.wait();}catch(Exception e){} try { Thread.sleep(200) ; } catch (InterruptedException e) { e.printStackTrace(); }// 模拟消费耗时 System.out.println(Thread.currentThread().getName()+" ....消费者...."+this.name); flag =false; //2)唤醒所有进程 this.notifyAll(); } }
相关推荐
java多线程实现生产者和消费者
编写一个“生产者-消费者”的多线程演示程序,两个生产者,一个消费者,可以存放产品的仓库容量为10,仓库用栈实现,并有同步功能,且能防止先消费后生产的情况。
用java多线程简易实现生产者消费者模式的代码,用java多线程简易实现生产者消费者模式的代码。
Qt5多线程,使用QSemaphore类实现生产者和消费者问题。
使用多线程程序模拟实现单生产者/多消费者问题。 要求“生产者”随机产生一个整数,“消费者 1”将这个整数加 1 后输出,“消 费者 2”将这个整数加 2 后输出,“消费者 3”将这个整数加 3 后输出,“消 费者 4”将...
java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现...
用线程实现生产者消费者问题,生产者消费者的个数任意!
以生产者/消费者问题为例来阐述Linux线程的控制和通信。一组生产者线程与一组消费者线程通过缓冲区发生联系。生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。缓冲区有N 个,是一个环形的缓冲池。 ...
a: 创建一个线程 ...h: problem1 生产者消费者问题 (1生产者 1消费者 1缓冲区) problem1 more 生产者消费者问题 (1生产者 2消费者 4缓冲区) problem2 读者与写着问题 I: 信号量 semaphore 解决线程同步问题
使用多线程实现了生产者和消费者模式
用java多线程,实现生产者消费者同步和互斥的问题,操作系统中的经典问题
Linux 多线程实现生产者消费者模式.pdf
设计要求:(1)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者线程的标识符.(2)生产者和消费者各有两个以上.(3)多个生产者或多个消费者之间须有共享对缓冲区...
多线程实现生产者消费者模型:锁(Lock)、信号量(Semaphore、BoundedSemaphore)、条件(Condition)、队列(Queue)、事件(Event) 多进程程实现生产者消费者模型:信号量(Semaphore)、条件(Condition)、...
基本满足操作系统课上要求,java实现的生产者消费者模型。
java多线程实现生产者消费者关系,完成线程之间的同步。
主线程、生产者线程(一)、消费者管理线程(一)、消费者线程(多),以及一些全局变量。 主线程职责:UI控件的控制和显示、控制生产者:调节生产的速度和暂停与继续、控制消费 生产者线程职责:根据商品数量调控...
实验目的:使用多线程并发程序设计模拟生产者消费者问题,了解P-V操作的实现方法,实现生产者和消费者的同步和互斥,了解各线程如何使用临界资源和临界区。 主要内容:约束条件:生产者进程负责生产产品放到缓冲区,...
java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型...