Java通过线程如何解决生产者/消费者问题?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示
生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况:
存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品。互相等待,从而发生死锁。
以下实例演示了如何通过线程解决生产者/消费者问题:
/* 作者通过javaidea.com ProducerConsumerTest.java */公开课ProducerConsumerTest { 公共静态void main (String [] args) { 舒适的c=new舒适(); 生产者p1=new (c, 1); 消费者c1=新的消费者(c, 1); p1.start (); c1.start (); } } 类文件架{ 私人int内容; 私人布尔可用=false; 公共同步int get () { 而(可用==false) { 尝试{ wait (); } 抓住(InterruptedException e) { } } 可用=false; notifyAll (); 返回内容; } 公共同步空白把(int值){ 而(可用==true) { 尝试{ wait (); } 抓住(InterruptedException e) { } } 内容=价值; 可用=true; notifyAll (); } } 类消费扩展线程{ 私人舒适的舒适; 私人int数; 公共消费(舒适的c, int数){ 舒适的=c; 这一点。数量=数量; } 公共空间run () { int值=https://www.yisu.com/zixun/0; for (int i=0;我<10;我+ +){ 值=cubbyhole.get (); system . out。println(“消费者#”+。数量+“:”+价值); } } } 类生产商延伸线程{ 私人舒适的舒适; 私人int数; 公共生产商(舒适的c, int数){ 舒适的=c; 这一点。数量=数量; } 公共空间run () { for (int i=0;我<10;我+ +){ cubbyhole.put(我); system . out。println(“生产者#”+。数量+“:”+ i); 尝试{ 睡眠((int) (math . random () * 100)); }捕捉(InterruptedException e) {} } } }
以上代码运行输出结果为:
消费者# 1有:0
引用>
生产者# 1说:0
生产者# 1将:1
消费者# 1有:1
生产者# 1说:2
消费者# 1有:2
生产者# 1说:3
消费者# 1有:3
生产者# 1说:4
消费者# 1有:4
生产者# 1说:5
消费者# 1有:5
生产者# 1说:6
消费者# 1有:6
生产者# 1说:7
消费者# 1有:7
生产者# 1说:8
消费者# 1有:8
生产者# 1说:9
消费者# 1有:9看完上述内容,你们掌握Java通过线程如何解决生产者/消费者问题的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!
Java通过线程如何解决生产者/消费者问题