Java 生产者/消费者问题实例详解
作者:wbb 时间:2023-02-26 01:23:36
生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况:
存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品。互相等待,从而发生死锁。
以下实例演示了如何通过线程解决生产者/消费者问题:
/*
author by w3cschool.cc
ProducerConsumerTest.java
*/
public class ProducerConsumerTest {
public static void main(String[] args) {
CubbyHole c = new CubbyHole();
Producer p1 = new Producer(c, 1);
Consumer c1 = new Consumer(c, 1);
p1.start();
c1.start();
}
}
class CubbyHole {
private int contents;
private boolean available = false;
public synchronized int get() {
while (available == false) {
try {
wait();
}
catch (InterruptedException e) {
}
}
available = false;
notifyAll();
return contents;
}
public synchronized void put(int value) {
while (available == true) {
try {
wait();
}
catch (InterruptedException e) {
}
}
contents = value;
available = true;
notifyAll();
}
}
class Consumer extends Thread {
private CubbyHole cubbyhole;
private int number;
public Consumer(CubbyHole c, int number) {
cubbyhole = c;
this.number = number;
}
public void run() {
int value = 0;
for (int i = 0; i < 10; i++) {
value = cubbyhole.get();
System.out.println("消费者 #" + this.number+ " got: " + value);
}
}
}
class Producer extends Thread {
private CubbyHole cubbyhole;
private int number;
public Producer(CubbyHole c, int number) {
cubbyhole = c;
this.number = number;
}
public void run() {
for (int i = 0; i < 10; i++) {
cubbyhole.put(i);
System.out.println("生产者 #" + this.number + " put: " + i);
try {
sleep((int)(Math.random() * 100));
} catch (InterruptedException e) { }
}
}
}
以上代码运行输出结果为:
消费者 #1 got: 0
生产者 #1 put: 0
生产者 #1 put: 1
消费者 #1 got: 1
生产者 #1 put: 2
消费者 #1 got: 2
生产者 #1 put: 3
消费者 #1 got: 3
生产者 #1 put: 4
消费者 #1 got: 4
生产者 #1 put: 5
消费者 #1 got: 5
生产者 #1 put: 6
消费者 #1 got: 6
生产者 #1 put: 7
消费者 #1 got: 7
生产者 #1 put: 8
消费者 #1 got: 8
生产者 #1 put: 9
消费者 #1 got: 9
希望本篇文章对您有所帮助
来源:http://www.2cto.com/kf/201601/486921.html
标签:Java,生产者消费者
0
投稿
猜你喜欢
WPF仿LiveCharts实现饼图的绘制
2022-02-08 02:17:05
深入理解Android中的建造者模式
2023-06-27 05:55:17
java中归并排序和Master公式详解
2022-03-30 08:53:19
简单介绍Android开发中的Activity控件的基本概念
2022-02-23 23:46:21
一文教你如何使用Databinding写一个关注功能
2023-09-17 12:26:47
浅谈Java堆外内存之突破JVM枷锁
2022-10-19 19:46:50
C#资源释放方法实例分析
2022-03-22 04:46:20
java后台接受到图片后保存方法
2023-06-03 09:23:04
c#典型工厂化实现实例
2022-01-04 19:41:08
Java8 HashMap键与Comparable接口小结
2023-11-29 10:10:31
详谈java中File类getPath()、getAbsolutePath()、getCanonical的区别
2022-08-18 19:21:44
C#学习基础概念二十五问 11-15
2022-04-18 04:19:00
基于Java实现双向链表
2022-11-17 11:39:16
Android开发之使用150行代码实现滑动返回效果
2023-03-20 11:08:50
C语言实现矩阵翻转(上下翻转、左右翻转)
2023-10-24 22:42:36
MyBatis-Plus 集成动态多数据源的实现示例
2023-06-26 17:56:35
Spring计时器StopWatch使用示例
2023-05-16 21:23:02
C#设计模式之职责链模式示例详解
2023-11-08 05:26:38
idea构建web项目的超级详细教程
2023-09-07 13:21:39
C#获取网页源代码的方法
2023-06-19 05:43:44