这篇文章主要实例分析了java中生产者消费者问题的方法,需要的朋友可以可以参考下
生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况:
存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品。互相等待,从而发生死锁。
以下实例演示了如何通过线程解决生产者/消费者问题:
/*
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
【相关推荐】
1. java免费视频教程
2. 极客学院java视频教程
3. fastjson开发教程
以上就是关于java生产者与消费者的实例详解的详细内容。