JUC练习2——java生产者消费者demo
2022/1/11 1:05:01
本文主要是介绍JUC练习2——java生产者消费者demo,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
以下的代码示例:先使用了synchronized关键字来实现生产者消费者,而后使用了JUC中的lock及其condition来实现生产者消费者
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class JucTest1 { public static void main(String[] args) { Ticket ticket = new Ticket(); for (int i=0;i<4;i++) { new Thread(()-> { try { for (int j=0;j<10;j++) { ticket.produce(); } } catch (InterruptedException e) { e.printStackTrace(); } },"A"+i).start(); new Thread(()-> { try { for (int j=0;j<10;j++) { ticket.consumer(); } } catch (InterruptedException e) { e.printStackTrace(); } },"B"+i).start(); } JUCTicket jucTicket = new JUCTicket(); for (int i=0;i<4;i++) { new Thread(()-> { for (int j=0;j<10;j++) { jucTicket.produce(); } },"C"+i).start(); new Thread(()-> { for (int j=0;j<10;j++) { jucTicket.consumer(); } },"D"+i).start(); } } } //使用synchronized来模拟生产者消费者问题 class Ticket { private int number = 0; //使用synchronized来实现并发,synchronized可以锁当前对象 synchronized void produce() throws InterruptedException { //如果使用if判断存在虚假唤醒问题,也就是两个线程同时进入,所以我们一般把等待的内容放到where中 while (number != 0) { //等待消费者消费 this.wait(); } number++; System.out.println(Thread.currentThread().getName()+"生产后,number="+number); //通知其它线程我生产完成了 this.notifyAll(); } synchronized void consumer() throws InterruptedException { while (number == 0) { //等待生产者生产 this.wait(); } number--; System.out.println(Thread.currentThread().getName()+"消费后,number="+number); //通知其它线程我消费完成了 this.notifyAll(); } } //使用lock锁来模拟生产者消费者问题 class JUCTicket { private int number = 0; private Lock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); //condition.signalAll();相当于this.notifyAll(); //condition.await();相当于this.wait(); //使用synchronized来实现并发,synchronized可以锁当前对象 void produce(){ lock.lock(); try { while (number != 0) { //等待消费者消费 condition.await(); } number++; System.out.println(Thread.currentThread().getName()+"生产后,number="+number); //通知其它线程我生产完成了 condition.signalAll(); }catch (Exception e) { e.printStackTrace(); }finally { lock.unlock(); } } void consumer(){ lock.lock(); try { while (number == 0) { //等待生产者生产 condition.await(); } number--; System.out.println(Thread.currentThread().getName()+"消费后,number="+number); //通知其它线程我生产完成了 condition.signalAll(); }catch (Exception e) { e.printStackTrace(); }finally { lock.unlock(); } } }
运行的结果:生产者只能生产一个,生产后,需要等待其它消费者进行消费,消费者消费完成后通知生产继续生产
B0消费后,number=0
A0生产后,number=1
B0消费后,number=0
A1生产后,number=1
B1消费后,number=0
A0生产后,number=1
B2消费后,number=0
这篇关于JUC练习2——java生产者消费者demo的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-08如何用关键链方法突破项目管理瓶颈?
- 2025-01-08电商人必看!6 款提升团队协作与客户满意度软件!
- 2025-01-08电商团队管理混乱?快用这 6 款软件优化协作流程!
- 2025-01-08短剧制作效率低?试试这5款任务管理工具
- 2025-01-08高效应对电商高峰,6 款团队协作软件大揭秘!
- 2025-01-08为什么外贸人都爱上了在线协作工具?
- 2025-01-08提升工作效率,从这些任务管理工具开始
- 2025-01-08新年电商订单暴增,必备的 6 款可视化协作办公软件有哪些?
- 2025-01-08短剧制作经理必备技能与工具全解析
- 2025-01-08在线协作让年货大促轻松应对!