2016-07-01 18 views
0

終了するはずのスレッドがありますが、それはしませんでした。Java - Executors.newFixedThreadPoolで実行されたスレッドは決して終了しません。

Unsafe.park(boolean, long) line: not available [native method] 
LockSupport.park(Object) line: not available  
AbstractQueuedSynchronizer$ConditionObject.await() line: not available 
LinkedBlockingQueue<E>.take() line: not available 
ThreadPoolExecutor.getTask() line: not available  
ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) line: not available 
ThreadPoolExecutor$Worker.run() line: not available 
Thread.run() line: not available  

コード::私も代わりCountDownLatchSemaphorを使用しようとしましたが、同じ結果を持っていた

ExecutorService threadExecutor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); 
int totalNumberOfTasks = 0; 
for(int i = 0; i < size; i++) { 
    if(expr != null) { 
     totalNumberOfTasks++; 
     threadExecutor.execute(new Runnable() { 

      @Override 
      public void run() { 
       doSmth(); 
      } 
     }); 
    } 
} 
CountDownLatch latch = new CountDownLatch(totalNumberOfTasks); 
try { 
    latch.await(); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 

(デバッガで確認)各スレッドでのスタックトレースがあります。誰かが私を助けることができますか?あなたが事前にタスクの数がわからない場合、あなたはinvokeAllを使用することができ

ExecutorService threadExecutor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); 

// Must be available in Runnables 
final CountDownLatch latch = new CountDownLatch(size); 

int totalNumberOfTasks = 0; 
for(int i = 0; i < size; i++) { 
    if(expr != null) { 
     totalNumberOfTasks++; 
     threadExecutor.execute(new Runnable() { 

      @Override 
      public void run() { 
       doSmth(); 
       latch.countDown(); // Countdown the latch 
      } 
     }); 
    } 
} 

try { 
    latch.await(); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 

+1

あなたは、ラッチをカウントダウンされていません...ので、あなたは永遠に待ちます。完全に期待される結果。 – Fildor

+0

はい、あります。しかし、おそらく 'CountDownLatch'は私の場合、タスクの数があらかじめ定義されていないときは役に立ちません。 'セマフォ'を 'Runnable'の中でどのように使うべきですか? – Ivan

+0

私の編集した答えを見てください。 – Fildor

答えて

1

はこれを試してみてください

は、その状態を保持している先物のリストを返す、与えられたタスクを実行し、すべてが完了すると結果が返されます。

0

ワーカースレッドが終了するとラッチがカウントダウンされません。 私はCountDownLatchは全くなく、スレッドが終了するのを待つためにExecutorServiceさんshutdownawaitTermination方法に頼って使用することはありません。

ExecutorService threadExecutor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); 
for(int i = 0; i < size; i++) { 
    if(expr != null) { 
     threadExecutor.execute(new Runnable() { 

      @Override 
      public void run() { 
       doSmth(); 
      } 
     }); 
    } 
} 

threadExecutor.shutdown(); 
try { 
    threadExecutor.awaitTermination(10, TimeUnit.MINUTES); 
} catch (InterruptedException ex) { 
    // handle timeout 
} 
関連する問題