Блокировка асинхронных очередей Java
Я пытаюсь найти способ реализовать следующее в Java.
Thread1 добавит задания в очередь1. Другой другой поток (Thread2) добавит задания в очередь2.
В методе run() Thread1 я жду, пока в очереди 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 ответ
Вы не совсем хорошо объяснили свой вопрос, и я не уверен, что вы пытаетесь спросить - очень сложно читать то, что вы написали. Кроме того, я не вижу кода для Thread-2
а также Queue-2
,
Итак, я собираюсь дать общий совет,
1.Используйте существующую реализацию очереди блокировки вместо того, чтобы делать private List queue1 = new LinkedList();
а затем делать synchronized(queue1)
,
Вот документация BlockingQueue
интерфейс. Вы можете использовать класс, LinkedBlockingQueue
как реализация.
2.Пример кода - если вы просматриваете ссылку выше BlockingQueue
Документация, вы видите код внизу, подчеркивая, как писать для потребителей и производителей. Там вы не видите, как создается экземпляр очереди внутри класса Thread, но устанавливается через конструктор - таким образом, вы можете разделить одну очередь с любым количеством потоков, сколько захотите, - передав ссылку в очередь в Runnable
конструктор.
3.Реализации BlockingQueue являются поточно-ориентированными, поэтому вам не нужно synchronize
на экземплярах очереди. Вы можете свободно передавать экземпляры очереди в любое количество потоков, полагая, что его методы будут вызываться синхронизированным образом.
Поэтому я предлагаю вам переписать любую программу, которую вы пытаетесь написать, используя приведенную выше конструкцию и примеры кода, и вернуться к другим вопросам.
Надеюсь, поможет!!