阻止异步队列Java

时间:2016-10-13 13:59:59

标签: java concurrency queue java-threads

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

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

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

我如何通知Thread1 Thread2在queue2中添加了一个作业? 这是Thread1类

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
    }
}

1 个答案:

答案 0 :(得分:0)

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

所以我要提出一般性意见,

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

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

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

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

所以我建议您尝试使用上面的构造和代码示例重写您尝试编写的任何程序,然后再回过头来处理更多问题。

希望它有所帮助!!