2

同時に実行されている複数のスレッドを持つスレッドプール エグゼキュータがあります。すべてのスレッドが完了した後にコードを実行したいと考えています。どうすればこれを達成できますか?

      for(String x : mList){
        mExecutor.execute(new Runnable(){

            @Override
            public void run() {
                //Do Stuff
                            }

        });

       //after all threads finish
       doOtherStuff();
4

3 に答える 3

2

を使用する必要がありますCountDownLatchCountDownLatchエグゼキュータのスレッド数で初期化します。の最後にRunnable、追加しますCountDownLatch.countDown();

 CountDownLatch countDownL = new CountDownLatch(N);
for(String x : mList){
        mExecutor.execute(new Runnable(){

            @Override
            public void run() {
                //Do Stuff
                countDownL.countDown();
            }

        });
  }

   countDownL.await();
       //after all threads finish
       doOtherStuff();

await()を呼び出すと、値が 0 になるまで、呼び出し元のブロッカーが発生することに注意してcountDonwLください。もちろん、UI スレッドで await() を呼び出すと、UI がブロックされます。

編集構文を確認する前に書き留めました。そのため、いくつかのタイプミスが発生する可能性があります。

于 2012-07-07T15:45:53.083 に答える
2

これはあなたが必要とするものを達成するはずです:

for(String x : mList) {
   mExecutor.execute(new Runnable() {    
        @Override
        public void run() {
            //Do Stuff
        }    
   });
 }

 mExecutor.shutdown();
 mExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);

 //after all threads finish
 doOtherStuff();
于 2012-07-07T15:53:31.100 に答える
0

java.util.concurrency パッケージで提供される CountDownLatchを使用すると、ここで必要なことを達成するのに役立ちます。

CountDownLatch latch = new CountDownLatch(3);

上記の行は、カウントが 3 の CountDownlatch を作成します。

latch.countDown();

上記の行は、実行されるたびにラッチを 1 減らします。

latch.await();

上記の行により、ラッチのカウント ダウンが 0 に達すると、その下のコードが実行されます。この後、必要な作業を配置できます....

于 2012-07-07T16:21:42.643 に答える