【发布时间】:2015-01-16 22:04:25
【问题描述】:
我正在尝试使用 java 中的线程解决生产者消费者问题,但代码不会并行/并发运行。生产者总是在消费者开始消费之前完全填满缓冲区,我不明白为什么。重点是尝试仅使用同步块、wait() 和 notify() 来完成。
主要:
String [] data = {"Fisk", "Katt", "Hund", "Sau", "Fugl", "Elg", "Tiger",
"Kameleon", "Isbjørn", "Puma"};
ProducerConsumer pc = new ProducerConsumer(5);
Thread[] thrds = new Thread[2];
thrds[0] = new Thread(new MyThread1(pc, data)); // producer
thrds[1] = new Thread(new MyThread2(pc)); // consumer
thrds[0].start();
thrds[1].start();
for(int i = 0; i < 2; i++) { // wait for all threads to die
try {
thrds[i].join();
}
catch (InterruptedException ie) {}
}
System.exit(0);
ProducerConsumer.java:
import java.util.LinkedList;
import java.util.Queue;
public class ProducerConsumer implements Runnable {
private int bufferSize;
private Queue<String> buffer;
public ProducerConsumer(int size) {
bufferSize = size;
buffer = new LinkedList<String>();
}
public void produce(String item) throws InterruptedException {
synchronized(buffer) {
while (buffer.size() >= bufferSize) {
try {
System.out.println("Full buffer. Waiting for consumer...");
buffer.wait();
}catch (Exception e) {}
}
buffer.add(item);
System.out.println("Producer is putting " + item + " in the buffer");
buffer.notify();
}
}
public void consume() throws InterruptedException {
synchronized (buffer) {
while (buffer.size() == 0) {
try {
System.out.println("Empty buffer. Waiting for production...");
buffer.wait();
}catch (Exception e) {}
}
System.out.println("Consumer is consuming " + buffer.remove() + ".");
buffer.notify();
}
}
@Override
public void run() {
}
}
MyThread1:
/*
* PRODUCER - Thread
*/
public class MyThread1 implements Runnable {
private String [] data;
private ProducerConsumer pc;
public MyThread1(ProducerConsumer pc, String [] data) {
this.pc = pc;
this.data = data;
}
@Override
public void run() {
for (int i = 0; i < data.length; i++) {
try {
pc.produce(data[i]);
} catch (InterruptedException ex) {}
}
}
}
MyThread2:
//消费者 - 线程
public class MyThread2 implements Runnable{
private ProducerConsumer pc;
public MyThread2(ProducerConsumer pc) {
this.pc = pc;
}
//Run consume
@Override
public void run() {
while (true) {
try {
pc.consume();
Thread.sleep(2);
}
catch(InterruptedException e) {}
}
}
}
【问题讨论】:
-
我想是因为
synchronized(buffer) -
A) 这是某种任务还是您有其他理由不使用BlockingQueue? B)没有代码可以防止生产者尽可能快。如果你想让这种情况发生,也许让它睡觉左右?线程没有指定的计时行为,启动的第一个线程可能在您开始第二个之前完成。
-
而ProducerConsumer为什么要实现Runnable?
-
是的,这是一项任务。我忘了在问题中提到我只使用同步块,wait() 和 notify()。我现在编辑了它。
-
@NamanGala :这是我最后的努力,看看它是否会改变什么。
标签: java multithreading consumer producer