我想創建一個線程,當值變爲空時將值放入隊列中,等待這種情況,而不是。這裏是我試過使用的代碼,但它打印在Java中等待條件
Adding new
Taking Value 1
Taking Value 2
Taking Value 3
Taking Value 4
所以它只工作一次。問題是什麼?
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class SO {
public String test;
public String[] list = new String[] {test};
public static void main(String[] args) {
new SO();
}
public SO() {
go();
}
BlockingQueue<String> qq = new LinkedBlockingQueue<String>();
class Producer implements Runnable {
public void run() {
try {
while (true) {
synchronized (this) {
while (qq.size() > 0)
wait();
System.out.println("Adding new");
qq.put("Value 1");
qq.put("Value 2");
qq.put("Value 3");
qq.put("Value 4");
}
}
} catch (InterruptedException ex) {}
}
}
class Consumer implements Runnable {
public void run() {
try {
while(true) {
System.out.println("Taking " + qq.take()+". "+String.valueOf(qq.size())+" left");
Thread.sleep(1000);
}
} catch (InterruptedException ex) {}
}
}
public void go() {
Producer p = new Producer();
Consumer c = new Consumer();
new Thread(p).start();
new Thread(c).start();
}
}
而不是使用等待/通知和相關大小檢查邏輯,您可以使用隊列上的LinkedBlockingQueue.put來做到這一點(取決於您是否希望多個對象在隊列中等待消耗)的容量1。'put'方法javadocs說:「將指定的元素插入此隊列的尾部,如果有必要,等待空間變爲可用。」 – Ash 2010-02-28 10:49:53