2012-11-19 2 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.execute (작업)을 통해 TaskThreadPool2에 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가 발생했습니다. execute 메소드가 threadPool 중 하나에서 호출되지 않았습니다. execute 메서드를 호출하면 작업자 스레드가 시작되고 청취가 시작됩니다. 그러면 우리는 동일한 대기열을 듣는 두 개의 풀을 갖게 될 것이고 우리는 유비쿼터스 응답을 얻을 것입니다. – user1834733

관련 문제