阻止异步队列 Java

Blocking async queues Java

我正在尝试找出一种在 Java 中实现以下内容的方法。

Thread1 将向 queue1 添加作业。 另一个不同的线程 (Thread2) 将向 queue2 添加作业。

在 Thread1 的 运行() 方法中,我一直等到队列 1 中有作业,假设我将打印它,当且仅当队列 2 中没有等待作业时。

如何通知 Thread1 Thread2 已在 queue2 中添加了作业? 这是 Thread1 Class

public class Thread1 implements Runnable {
private List queue1 = new LinkedList();

public void processData(byte [] data, int count) {
    byte[] dataCopy = new byte[count];
    System.arraycopy(data, 0, dataCopy, 0, count);
    synchronized(queue1) {
        queue1.add(data);
        queue1.notify();
    }
}

public void run() {
    byte [] data;

    while(true) {
        // Wait for data to become available
        synchronized(queue1) {
            while(queue1.isEmpty()) {
                try {
                    queue1.wait();
                } catch (InterruptedException e) {}
            }
            data = (byte[]) queue1.remove(0);
        }
        // print data only if queue2 has no awaiting jobs in it
    }
}

你没有很好地解释你的问题,我不确定你想问什么 - 阅读你写的内容非常混乱。另外,我没有看到 Thread-2Queue-2 的任何代码。

所以我要提出一般性建议,

1.使用阻塞队列的现有实现,而不是执行private List queue1 = new LinkedList(); 然后执行synchronized(queue1)

这里是BlockingQueue界面的documentation。您可以使用 class 、 LinkedBlockingQueue 作为实现。

2.示例代码 - 如果您浏览 BlockingQueue 文档的上方 link,您会在底部看到代码突出显示如何编写消费者和生产者。在那里你看不到队列实例在 Thread class 中创建,而是通过构造函数设置 - 这样你就可以与任意多的线程共享一个队列 - 通过在 Runnable 中传递对队列的引用构造函数。

3.BlockingQueue 实现是线程安全的 - 因此您不必synchronize在队列实例上。您可以自由地将队列实例传递给任意数量的线程,相信它的方法将以同步方式调用。

因此,我建议您尝试使用上述构造和代码示例重写您尝试编写的任何程序,然后回来回答更多问题。

希望对您有所帮助!!