这个 java 阻塞队列变体可能吗?
is this java blocking queue variant possible?
下面的场景是我想到的:
- 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);
}
}
}
}
这只是我想如何实现我的程序部分的伪实现。
-这行得通吗?
- 这可以与队列上的静态修饰符一起使用吗?
这是生产者-消费者的自然模式,所以是的,这会起作用。
顺便说一句 - 你不需要检查队列看它是否为空 - 你只需要调用 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
方法中创建侦听器。服务器应该尽可能少地了解消费者。队列、服务器和消费者都应该在其他地方创建和链接。
下面的场景是我想到的:
- 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);
}
}
}
}
这只是我想如何实现我的程序部分的伪实现。
-这行得通吗?
- 这可以与队列上的静态修饰符一起使用吗?
这是生产者-消费者的自然模式,所以是的,这会起作用。
顺便说一句 - 你不需要检查队列看它是否为空 - 你只需要调用 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
方法中创建侦听器。服务器应该尽可能少地了解消费者。队列、服务器和消费者都应该在其他地方创建和链接。