2017-11-10 30 views
1

출력을 이해하는 데 어려움이 있습니다. 여기에 집행자를 만든 다음 Runnable 작업을 1000 번 제출하십시오. 예상 출력은 Runable 안에 synchronized을 추가 했으므로 1000입니다. 그러나 실제 출력은 503과 다릅니다. 아무에게도 설명해 줄 수 있습니까? bvExecutorService : 출력이 예상되지 않습니다.

public class FutureTest { 

    int count=0; 

    public void testExecutor(){ 
     CountDownLatch counter = new CountDownLatch(1000); 
     Runnable incr =()->{ 
      //System.out.println("count="+count); 
      synchronized(this){ 
       count++;  
      } 
      counter.countDown(); 

     }; 
     ExecutorService service = Executors.newFixedThreadPool(10); 
     IntStream.range(0, 1000).forEach(i->service.submit(incr)); 
     counter.await(); 
     service.shutdown(); 

     System.out.println(count); 
    } 


    public static void main(String[] args) { 
     new FutureTest().testExecutor(); 

    } 

} 
+0

모든 스레드가 완료되기 전에 카운트가 인쇄됩니다. 카운트 다운 래치가 필요합니다. –

+0

Runnable에'Thread.sleep (10)'을 추가하면 무슨 뜻인지 알 수 있습니다. 그 다음 count는 0 –

+0

@ NathanHughes이고, 여기에서 'this'는 main 메소드에서 생성 된'new FutureTest()'입니다. –

답변

1

계산 스레드의 모든 Runnable 코드가 호출되기 전에 호출 스레드에서 카운트를 인쇄하고 있습니다. Runnable 내에 짧은 Thread.sleep을 넣으면 카운트가 더 적다는 것을 알 수 있습니다. 이러한 계산으로 당신은 모든 스레드가 작업을 완료 한 경우에 대한 몇 가지 알림을 사용할 수 있습니다

public void testExecutor(){ 
    Runnable incr =()->{ 
     //System.out.println("count="+count); 
     synchronized(this){ 
      try { 
       Thread.sleep(10); 
      catch (InterruptedException e){} 
      count++;  
     } 
    }; 

은 래치를 아래로 또는 .awaitTermination(...).

IntStream.range(0, 1000).forEach(i->service.submit(incr)); 
    service.shutdown(); 

    try { 
     service.awaitTermination(1000, TimerUnit.SECONDS); 
    } catch (InterruptedException e){} 

    System.out.println(count); 
+0

감사합니다. 나는'CountDownLatch'를 추가하고 이제는 OK입니다. –

+0

@shijiexu : 제발 편집을 참조하십시오 –