我有一个线程,处理输入消息(无限循环)。为此,我使用了一个非常好的BlockingQueue(Java)。现在,我想在同一个Class oder方法中添加第二个处理器。现在的问题是,在无限循环中我有这个部分
newIncomming = this.incommingProcessing.take();
如果队列为空,此部分将阻止。我正在寻找一个解决方案来处理同一个类中的队列。第二个队列只能处理,有些数据会进入第一个队列。 有没有办法在同一个无限循环中处理两个阻塞队列?
答案 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();
}
}
您可以从控制台输入文字,将任务添加到阻止等级b1
或b2
。如果您的控制台input
以1
开头,例如input = "1 hello"
,那么b1
将处理任务(打印first: hello
)否则输入以{{开头} 1}}例如2
,然后b2将打印input = "world"
。