2012-11-19 86 views
0

我有一个场景,其中两个threadPool实例共享相同的阻塞队列。下面是代码ThreadPoolExecutor共享相同的阻塞队列

<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> 

现在我有一个问题,会是什么,如果我将在TaskThreadPool2通过TaskThreadPool2.execute(任务)提交超过5任务行为。

我觉得TaskThreadPool1也应该开始执行这些任务bcoz它也在监听同一队列。

+2

数据确实是代码。 – Perception

回答

0

真的不能想到有两个线程池用于相同阻塞队列的原因。找出最好的方法是制作一个程序并运行它。

说了不需要有两个这样的池,增加了池的大小加倍。

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

0

不,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); 

运行它,没有任何反应,ex1忽略队列中的任务。但是,添加此

ex1.execute(r); 

你会看到

running 
    running 
    running 

执行人与执行激活()。

+0

那是不正确的。它正在发生bcoz,执行方法未被调用到threadPool之一。一旦你调用execute方法,它将启动工作线程,然后它将开始监听。那么我们将有两个池监听相同的队列,我们​​将获得无处不在的响应。 – user1834733