Блокировка асинхронных очередей 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на экземплярах очереди. Вы можете свободно передавать экземпляры очереди в любое количество потоков, полагая, что его методы будут вызываться синхронизированным образом.

Поэтому я предлагаю вам переписать любую программу, которую вы пытаетесь написать, используя приведенную выше конструкцию и примеры кода, и вернуться к другим вопросам.

Надеюсь, поможет!!

Другие вопросы по тегам