访问正在运行循环的另一个Thread的结果

时间:2016-09-03 22:07:02

标签: java multithreading

Thread A是一个执行计算的循环。

Thread B需要读取Thread A中包含的每个循环迭代产生的结果。

在不阻挡任何事情的情况下实现这一目标的最佳方法是什么?

1 个答案:

答案 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的功能以及其他实现,其中有很多功能。