两个BlockingQueue在同一个无限循环中?

时间:2010-04-02 23:23:23

标签: java queue blocking

我有一个线程,处理输入消息(无限循环)。为此,我使用了一个非常好的BlockingQueue(Java)。现在,我想在同一个Class oder方法中添加第二个处理器。现在的问题是,在无限循环中我有这个部分

newIncomming = this.incommingProcessing.take();

如果队列为空,此部分将阻止。我正在寻找一个解决方案来处理同一个类中的队列。第二个队列只能处理,有些数据会进入第一个队列。 有没有办法在同一个无限循环中处理两个阻塞队列?

4 个答案:

答案 0 :(得分:1)

您需要两个线程,或者需要它们共享相同的阻塞队列。 (或者你需要使用与阻塞队列不同的结构)

答案 1 :(得分:0)

BlockingQueue适用于多线程实现。相反,使用一个简单的队列。请参阅this

答案 2 :(得分:0)

我不确定你要做什么,但是如果你不希望线程在队列中阻塞(如果它是空的),你可以使用BlockingQueue.peek()来首先检查队列是否为空

答案 3 :(得分:0)

我从你的问题中理解我提出了以下内容

代码段

/*
 * 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();
    }
}

执行程序:

您可以从控制台输入文字,将任务添加到阻止等级b1b2。如果您的控制台input1开头,例如input = "1 hello",那么b1将处理任务(打印first: hello)否则输入以{{开头} 1}}例如2,然后b2将打印input = "world"