我想创建一个线程,当值变为空时将值放入队列中,等待这种情况,而不是。这里是我试过使用的代码,但它打印在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