这个java阻塞队列变体可能吗?
以下是我的想法:这个java阻塞队列变体可能吗?,java,multithreading,thread-safety,blockingqueue,Java,Multithreading,Thread Safety,Blockingqueue,以下是我的想法: -2个线程,1个生产者,1个消费者 -T1创建队列并启动下一个线程,可以将元素放入队列 ServerThread implements Runnable{ run(){ BlockingQueue q = new ArrayBlockingQueue(1024); ListenerThread lt = new ListenerThread8(q); lt.start(); ....
-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;
}
}
}
}
类的东西{
}
类ServerThread实现可运行{
@凌驾
公开募捐{
BlockingQueue q=新的ArrayBlockingQueue(1024);
ListenerThread lt=新ListenerThread(q);
新线程(lt.start();
q、 放置(信息);
}
}
类ListenerThread实现可运行{
易变布尔运行;
私有最终阻塞队列q;
公共ListenerThread(阻塞队列q){
这个。q=q;
}
@凌驾
公开募捐{
while(运行){
试一试{
sendMessage(q.take());
}捕获(中断异常例外){
运行=错误;
}
}
}
}
您不需要将队列设置为静态
我建议的唯一调整是不要在服务器
run
方法中创建侦听器。服务器应该尽可能少地了解消费者。队列、服务器和使用者都应该创建并连接到其他地方。可能是您应该尝试吗?@Andremoniy在谈到多线程时,尝试确实是不够的(尽管需要),因为,需要进行理论分析。最好使用并发队列它是线程安全的。在从队列读/写时,您需要确保使用同步的块,或者使用并发数据结构。@Andremoniy我没有多线程经验,读过jenkov的一篇文章,所以我喜欢在开始正确的操作之前从高级用户那里获得一些知识。在我当前的环境中,我的测试时间有点有限。您不能创建一个队列静态
@戈布林,没有所谓的静态队列。您可以有一个引用队列的static
变量,但当不同线程访问队列时,该变量对队列的行为没有任何影响。@jameslarge Yes,我要找的东西似乎是InheritableThreadLocal@Gobliins-是否确实需要一个InheritableThreadLocal
-它们在某些情况下使用。@OldCurmudgeon问题是,我需要一个静态变量,但该变量只能在两个引用的线程中访问。对于threadLocal,我只有这个变量的一个副本,但根本没有对同一个变量的引用。