Две BlockingQueue в един и същи безкраен цикъл?

Имам нишка, която обработва входящи съобщения (безкраен цикъл). За това използвам BlockingQueue (Java), който работи доста добре. Сега искам да добавя втори процесор в същия клас или метод. Проблемът сега е, че в безкрайния цикъл имам тази част

newIncomming = this.incommingProcessing.take();

Тази част блокира, ако опашката е празна. Търся решение за обработка на опашки в същия клас. Втората опашка може да се обработва само, когато постъпват данни за първата опашка. Има ли начин да се справят с опашките за блокиране на теглене в същия безкраен цикъл?


person DrDol    schedule 02.04.2010    source източник
comment
Искате да кажете, че искате да обработите 2 опашки за блокиране в една нишка?   -  person pajton    schedule 03.04.2010


Отговори (4)


Или имате нужда от две нишки, или те трябва да споделят една и съща опашка за блокиране. (Или трябва да използвате структура, различна от опашка за блокиране)

person Bill K    schedule 02.04.2010

BlockingQueue е предназначен за внедряване на множество нишки. Вместо това използвайте обикновена опашка. Вижте това.

person wallyk    schedule 02.04.2010

Не съм сигурен какво се опитвате да направите, но ако не искате нишката да блокира в опашката, ако е празна, можете да използвате BlockingQueue.peek(), за да проверите първо дали опашката е празна или не.

person pajton    schedule 03.04.2010

Това, което разбирам от вашия въпрос, стигнах до следното

Кодов фрагмент

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package blockingqueues;

import java.io.BufferedReader;
import java.io.Console;
import java.io.InputStreamReader;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 *
 * @author alfred
 */
public class BlockingQueues {
    private static String take(BlockingQueue<String> bq) {
        try {
            return bq.take();
        } catch(InterruptedException ie) {
            return null;
        }
    }

    public static void main(String args[]) throws Exception {
        final BlockingQueue<String> b1 = new LinkedBlockingQueue<String>();
        final BlockingQueue<String> b2 = new LinkedBlockingQueue<String>();
        ExecutorService es = Executors.newCachedThreadPool();
        es.execute(new Runnable() {
            public void run() {
                while (true) {
                    String results = take(b1);
                    if (results == null) {
                        break;
                    }
                    System.out.println("first: " + results);
                }
            }
        });
        es.execute(new Runnable() {
            public void run() {
                while (true) {
                    String results = take(b2);
                    if (results == null) {
                        break;
                    }
                    System.out.println("second: " + results);
                }
            }
        });
        BufferedReader br = new BufferedReader(
                new InputStreamReader(System.in)
                );
        String input = null;
        System.out.println("type x to quit.");
        while (!"x".equals(input)) {
            input = br.readLine();
            if (input.startsWith("1 ")) {
                // Add something to first blocking queue.
                b1.add(input.substring(2));   
            } else if (input.startsWith("2 ")) {
                // Add something to second blocking queue.
                b2.add(input.substring(2));
            }
        }
        es.shutdownNow();
        es.awaitTermination(10, TimeUnit.SECONDS);
        System.out.println("bye!");
        br.close();
    }
}

Изпълняваща програма:

Можете да въведете текст от конзолата, за да добавите задача към опашка за блокиране b1 или b2. Ако вашата конзола input започва с 1 като например input = "1 hello", тогава b1 ще обработи задача (отпечата first: hello), иначе ако въвеждането започва с 2 като например input = "world", тогава b2 ще отпечата second: world.

person Alfred    schedule 03.04.2010