以下的痤疮是我的想法:
- 2个主题,1个制作人,1个消费者
- T1创建队列并启动下一个线程,并且可以将元素放入队列
ServerThread implements Runnable{
run(){
BlockingQueue q = new ArrayBlockingQueue(1024);
ListenerThread lt = new ListenerThread8(q);
lt.start();
....
q.put(message);
}
}
-T2将等待队列中的元素并处理它们
ListenerThread implements Runnable{
...
run(){
while(run){
if(!q.isEmpty){
sendMessage(q.getfirst());
}else{
sleep(1000);
}
}
}
}
这只是我想如何实现我的部分程序的伪实现
- 这个工作吗?
- 这可以使用队列中的静态修饰符吗?
答案 0 :(得分:2)
这是生产者 - 消费者的自然模式,所以是的,这将起作用。
顺便说一下 - 你不需要检查队列是否为空 - 你只需要调用take
,它会等到有东西出现。
class Thing {
}
class ServerThread implements Runnable {
@Override
public void run() {
BlockingQueue<Thing> q = new ArrayBlockingQueue<>(1024);
ListenerThread lt = new ListenerThread(q);
new Thread(lt).start();
q.put(message);
}
}
class ListenerThread implements Runnable {
volatile boolean run;
private final BlockingQueue<Thing> q;
public ListenerThread (BlockingQueue<Thing> q) {
this.q = q;
}
@Override
public void run() {
while (run) {
try {
sendMessage(q.take());
} catch (InterruptedException ex) {
run = false;
}
}
}
}
您不需要排队static
。
我建议的唯一调整是不在服务器run
方法中创建监听器。服务器应该尽可能少地了解消费者。队列,服务器和消费者都应该在其他地方创建和链接。