2016-05-22 12 views
-1

タイムアウトは1秒後に発生するはずですが、そういうことは起こっていません。ExecutorServiceのタイムアウトが期待通りに機能していません

public class Worker implements Runnable { 

    int workerId; 

    public Worker(int workerId) { 
     super(); 
     this.workerId = workerId; 
    } 

    public void run() { 
     System.out.println(workerId+"Worker Started ...."); 
     try { 
      Thread.sleep(20000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     System.out.println(workerId+"Worker finishes....."); 
    } 
} 

import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.TimeUnit; 

public class TestExecutor { 

    public static void main(String[] args) { 
     ExecutorService executorService=Executors.newCachedThreadPool(); 
     for(int i=0;i<=2;i++){ 
      executorService.submit(new Worker(i)); 
     } 
     executorService.shutdown(); 
     try { 
      executorService.awaitTermination(1, TimeUnit.SECONDS); 
     } catch (InterruptedException e) { 
      System.out.println("Timeout Happen ....."); 
     } 
    } 
} 
+0

代わりに何が起こっていますか? – Nikem

+0

'executorService.awaitTermination(1、TimeUnit.SECONDS);で何が起こると思いますか?このコードは、あなたが期待した通りに動作するはずだと考えるドキュメンテーションの部分はどれですか? – Pshemo

答えて

0

このコード

try { 
    executorService.awaitTermination(1, TimeUnit.SECONDS); 
} catch (InterruptedException e) { 
    System.out.println("Timeout Happen ....."); 
} 

は、あなたがそれを行うことを期待しません。

例外:InterruptedExceptionある を - javadocsから

を待っている間に割り込みが発生した場合。 2番目のコードでコードが終了せず、InterruptedExceptionがスローされるのは、コードがexecutorServiceが終了するのを待っている間にスレッドが中断された場合だけです。 executorServiceが実際に終了するかどうかをテストするための正しい待ちが終了するために、スレッドを実行するための

try { 
    if(executorService.awaitTermination(1, TimeUnit.SECONDS)) 
     System.out.println("Terminated correctly"); 
    else 
     System.out.println("Termination failed"); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 

そしてexecutorService.shutdown()待ちだろう。したがって、送信された実行可能ファイルが終了するまで、あなたのコードは20秒間待機し、その間に新しいRunnablesを受け入れたり開始したりすることはありません。 Threadをあまり優雅な方法で終了させたい場合は、executorService.shutdownNow()を使用する必要があります。これは実行中のスレッドを中断させます。

+0

私はあなたの答えに同意しますが、実行中のスレッドをどのように中断しますか? – CoreThought

+0

'executorService.shutdownNow()'はそれを行います。これは、サービスがそれ以上の実行可能ファイルを受け入れないようにし、通常は実行中のすべてのThreradを中断します。 – Paul

+0

あなたはshutdownNow()を試してみるべきです。これにより、待機中のタスクの開始を防止し、現在実行中のタスクを停止しようとします。 –

関連する問題