Java 共享同一阻塞队列的ThreadPoolExecutor

Java 共享同一阻塞队列的ThreadPoolExecutor,java,Java,我有一个场景,两个线程池实例共享同一个阻塞队列。这是密码 <bean id="TaskQueue" class="java.util.concurrent.LinkedBlockingQueue"> <constructor-arg type="int"> <value>1000</value> </constructor-arg> </bean> &

我有一个场景,两个线程池实例共享同一个阻塞队列。这是密码

<bean id="TaskQueue" class="java.util.concurrent.LinkedBlockingQueue">
        <constructor-arg type="int">
            <value>1000</value>
        </constructor-arg>
    </bean>

    <bean id="TaskThreadPool1" class="java.util.concurrent.ThreadPoolExecutor">
        <constructor-arg type="int">
            <value>10</value>
        </constructor-arg>
        <constructor-arg type="int">
            <value>50</value>
        </constructor-arg>
        <constructor-arg type="long">
            <value>5</value>
        </constructor-arg>
        <constructor-arg>
            <value>SECONDS</value>
        </constructor-arg>
        <constructor-arg>
            <ref bean="TaskQueue" />
        </constructor-arg>
    </bean>


    <bean id="TaskThreadPool2" class="java.util.concurrent.ThreadPoolExecutor">
        <constructor-arg type="int">
            <value>1</value>
        </constructor-arg>
        <constructor-arg type="int">
            <value>1</value>
        </constructor-arg>
        <constructor-arg type="long">
            <value>5</value>
        </constructor-arg>
        <constructor-arg>
            <value>SECONDS</value>
        </constructor-arg>
        <constructor-arg>
            <ref bean="TaskQueue" />
        </constructor-arg>
    </bean>

1000
10
50
5.
秒
1.
1.
5.
秒
现在我有一个问题,如果我通过TaskThreadPool2.execute(task)在TaskThreadPool2中提交5个以上的任务,行为会是什么


我觉得TaskThreadPool1也应该开始执行这些任务,因为它也在侦听相同的队列

真的想不出为什么同一个阻塞队列有两个线程池。最好的方法是制作一个程序并运行它

既然说不需要两个这样的池,那么就把池的大小增加一倍


另外,若您想要有两个池,那个么请检查并发性,因为可能存在两个池中的一个线程将尝试访问队列中相同资源的情况。这可能会导致不可预测的结果。

否,TaskThreadPool1不会从队列执行任务,请参阅ThreadPoolExecutor构造函数(源)-它不会开始侦听工作队列。您可以轻松地测试它:

    BlockingQueue<Runnable> q = new LinkedBlockingQueue<Runnable>();
    Runnable r = new Runnable() {
        public void run() {
            System.out.println("running");
        }
    };
    q.add(r);
    q.add(r);
    ThreadPoolExecutor ex1 = new ThreadPoolExecutor(10, 50, 5, TimeUnit.SECONDS, q);
你会看到

    running
    running
    running

已使用execute()激活执行器

那不是真的。在bcoz中,未对其中一个线程池调用execute方法。调用execute方法后,它将启动工作线程,然后开始侦听。然后我们将有两个池监听同一个队列,我们将得到无处不在的响应。
    running
    running
    running