2017-11-10 24 views
1

出力を理解するのが難しいです。ここで私はエグゼキュータを作成し、Runnableタスクを1000回送信します。私はRunableの中に​​を追加しているので、期待される出力は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)'を追加するだけで意味が分かります。カウントは0 –

+0

@ NathanHughesであり、ここでは 'this'はメインメソッドで作成された' 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:どうぞ編集してください –

関連する問題