“生产者-消费者”模型 (2021-11-29)
2022/5/1 23:19:01
本文主要是介绍“生产者-消费者”模型 (2021-11-29),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Object类的方法:等待wait() , 唤醒队首线程notify() , 唤醒全部等待线程notifyAll()。利用等待和唤醒实现Producer线程、Consumer线程的互斥访问Message对象。
代码如下:
package ThreadDemo; class Message { private String msg = ""; private boolean flag = true; //记录型信号量,规定true表示没有消息(允许生产、不许消费),false表示已有消息(不许生产、允许消费) public synchronized void setMessage(String msg) { if(flag==false) { try { super.wait(); //不许生产、让Producer线程等待 } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } this.msg=msg; flag = false; //生产完成,改变信号量、唤醒Consumer super.notify(); } public synchronized String getMessage() { if(flag==true) { try { super.wait(); //不许消费、让Consumer线程等待 } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } try { return "msg = "+this.msg; } finally { //return后用finally确保指令执行 flag = true; //消费完成,改变信号量、唤醒Producer super.notify(); } } } class Producer implements Runnable{ private Message msg; public Producer(Message msg) { this.msg = msg; } @Override public void run() { for(int x=0;x<30;x++) { if(x%2==0) { msg.setMessage("夏天,穿短袖短裤"); } else { msg.setMessage("冬天,换秋衣秋裤"); } } } } class Consumer implements Runnable{ private Message msg; public Consumer(Message msg) { this.msg = msg; } @Override public void run() { for(int x=0;x<30;x++) { System.out.println(msg.getMessage()); } } } public class Main { public static void main(String[] args){ Message msg = new Message(); new Thread(new Producer(msg)).start(); //启动生产者线程 new Thread(new Consumer(msg)).start(); //启动消费者线程 } }
这篇关于“生产者-消费者”模型 (2021-11-29)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?