Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个java阻塞队列变体可能吗?_Java_Multithreading_Thread Safety_Blockingqueue - Fatal编程技术网

这个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,我只有这个变量的一个副本,但根本没有对同一个变量的引用。