2016-04-13 18 views
1

私は、スレッドプールがあります。Javaのスレッドプールタスクのタイムアウト問題

ThreadPoolExecutor pool = new ThreadPoolExecutor(cores, 50, 30L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(3000)); 

をそして私は実行します。

try { 
    pool.execute(() -> 
{ 
    //Very very long task, fetching from an external URL 
}); 
}catch(Exception e){ 
    e.printStackTrace(); 
} 

私は例外を取得することはありませんが、このコードは数分待ちます。 30秒以内にキャンセルするにはどうすればよいですか?

+0

注:あなたはこの方法でスレッドを中断することはできません。スレッドを中断するだけで、この割り込みを尊重するのはあなたが呼び出すライブラリです。あなたは、それが提供するAPIを使用してタスクを失敗させることで、基礎となる要求を直接クローズすることをお勧めします。 –

答えて

5

ドキュメントによると、第3パラメータのkeepAliveは、スレッドプール内の特定のタスクの待機時間を指定しませんが、アイドル状態のスレッドがプールから解放されるまでの時間を指定します。ご希望の動作のために

* @param keepAliveTime when the number of threads is greater than 
*  the core, this is the maximum time that excess idle threads 
*  will wait for new tasks before terminating. 

あなたは、プールをスレッド化に今後の課題を提出し、FutureTaskであなたのタスクをラップする必要があります。今後の課題では、あなたが30秒に指定している何のget(タイムアウト、TIMEUNIT)

FutureTask<T> task = new FutureTask<T>(c); 
pool.execute(task); 
return task.get(timeout, timeUnit); 
1

を呼び出すことができ、あなたのエグゼキュータのアイドルスレッドのkeepAliveTimeです。これは、現在処理中のタスクを超過している余分なスレッドが存続する期間です。ここで余分なスレッドは、指定したcorePoolSizeに応じて、ThreadPoolExecutorが生き続けるコアごとに1つのスレッドに加えて作成されたスレッドとして定義されます。

タイムアウトにタスクを送信するためには、あなただけ返さFutureを取ると、get(long timeout, TimeUnit unit)方法そのタイミングを使用して、あなたのThreadPoolExecutorにタスクを送信することができます

Future<Result> future = pool.execute(yourTask); 
Result result = future.get(30, TimeUnit.SECONDS); 

をまた見てみることができこの関連する質問:ExecutorService that interrupts tasks after a timeout

関連する問題