Thread A
是一个执行计算的循环。
Thread B
需要读取Thread A
中包含的每个循环迭代产生的结果。
在不阻挡任何事情的情况下实现这一目标的最佳方法是什么?
答案 0 :(得分:3)
您需要此处的Producer-Consumer模式。在Java中,您可以使用BlockingQueue
来实现它。这是一个ArrayBlockingQueue
的示例,用于将Double
计算结果从生产者传递给消费者:
<强> Producer.java 强>
class Producer implements Runnable {
private final BlockingQueue<Double> queue;
public Producer(BlockingQueue<Double> q) {
queue = q;
}
public void run() {
try {
while (true) {
Double result = calculateResult();
// This call will make the result available to the consumer:
queue.put(result);
}
} catch (InterruptedException ex) {
// Handle thread interruption here
}
}
}
<强> Consumer.java 强>
class Consumer implements Runnable {
private final BlockingQueue<Double> queue;
public Consumer(BlockingQueue<Double> q) {
queue = q;
}
public void run() {
try {
while (true) {
// This call Will wait until the next result is available:
Double result = queue.take();
// Process the result...
}
} catch (InterruptedException ex) {
// Handle thread interruption here
}
}
}
<强> Program.java 强>
class Program {
public static void main() {
BlockingQueue<Double> queue = new ArrayBlockingQueue<>();
Producer producer = new Producer(queue);
Consumer consumer = new Consumer(queue);
new Thread(producer).start();
new Thread(consumer).start();
}
}
如果需要,您可以创建共享同一队列的多个使用者或多个生成者(或两者)。这样可以平衡两个以上线程之间的工作。
另请参阅BlockingQueue
的功能以及其他实现,其中有很多功能。