【问题标题】:Two BlockingQueue in the same endless loop?两个 BlockingQueue 在同一个无限循环中?
【发布时间】:2010-04-02 23:23:22
【问题描述】:

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

newIncomming = this.incommingProcessing.take();

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

【问题讨论】:

  • 您的意思是要在一个线程中处理 2 个阻塞队列?

标签: java queue blocking


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我从你的问题中了解到我想出了以下内容

        代码 sn-p

        /*
         * 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),否则如果输入以2 开头,例如input = "world",那么b2 将打印second: world

        【讨论】:

          猜你喜欢
          • 2023-03-04
          • 1970-01-01
          • 2021-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-07
          • 1970-01-01
          • 2011-03-30
          相关资源
          最近更新 更多