阻止异步队列 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-2
和 Queue-2
的任何代码。
所以我要提出一般性建议,
1.使用阻塞队列的现有实现,而不是执行private List queue1 = new LinkedList();
然后执行synchronized(queue1)
。
这里是BlockingQueue
界面的documentation。您可以使用 class 、 LinkedBlockingQueue
作为实现。
2.示例代码 - 如果您浏览 BlockingQueue
文档的上方 link,您会在底部看到代码突出显示如何编写消费者和生产者。在那里你看不到队列实例在 Thread class 中创建,而是通过构造函数设置 - 这样你就可以与任意多的线程共享一个队列 - 通过在 Runnable
中传递对队列的引用构造函数。
3.BlockingQueue 实现是线程安全的 - 因此您不必synchronize
在队列实例上。您可以自由地将队列实例传递给任意数量的线程,相信它的方法将以同步方式调用。
因此,我建议您尝试使用上述构造和代码示例重写您尝试编写的任何程序,然后回来回答更多问题。
希望对您有所帮助!!
我正在尝试找出一种在 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-2
和 Queue-2
的任何代码。
所以我要提出一般性建议,
1.使用阻塞队列的现有实现,而不是执行private List queue1 = new LinkedList();
然后执行synchronized(queue1)
。
这里是BlockingQueue
界面的documentation。您可以使用 class 、 LinkedBlockingQueue
作为实现。
2.示例代码 - 如果您浏览 BlockingQueue
文档的上方 link,您会在底部看到代码突出显示如何编写消费者和生产者。在那里你看不到队列实例在 Thread class 中创建,而是通过构造函数设置 - 这样你就可以与任意多的线程共享一个队列 - 通过在 Runnable
中传递对队列的引用构造函数。
3.BlockingQueue 实现是线程安全的 - 因此您不必synchronize
在队列实例上。您可以自由地将队列实例传递给任意数量的线程,相信它的方法将以同步方式调用。
因此,我建议您尝试使用上述构造和代码示例重写您尝试编写的任何程序,然后回来回答更多问题。
希望对您有所帮助!!