2011-01-27 16 views
11

私は、いくつかのCallableを管理するExecutorServiceを持っています。 Callablesが実行するタスクは、主にブラックボックスの変換と数値の処理です。特定の条件下では、変換されるデータが振動し、スレッドは1時間以上かかる場合があります。比較のため、ほとんどのスレッドは1分以内に完了します。ExecutorServiceを使用した個々のスレッドの時間制限

長時間実行スレッドからのデータは関連性がありません。私は一定の時間以上実行されるスレッドを中断したいと思います。これを行う最善の方法は何でしょうか?

答えて

19

ScheduleExecutorServiceを使用して、タイムアウトに達すると長時間実行されるタスクtaskFuture.cancel(true)にタスクをスケジュールします。それ以前にタスクが終了した場合、タスクは取り消されません。

ExecutorService service = Executors.newFixedThreadPool(N); 
ScheduledExecutorService canceller = Executors.newSingleThreadScheduledExecutor(); 

public <T> Future<T> executeTask(Callable<T> c, long timeoutMS){ 
    final Future<T> future = service.submit(c); 
    canceller.schedule(new Callable<Void>(){ 
     public Void call(){ 
      future.cancel(true); 
      return null; 
     } 
    }, timeoutMS, TimeUnit.MILLI_SECONDS); 
    return future; 
} 
3

これを実行する最善の方法は、もう1つのエグゼキュータを導入することです。あなたは、たとえば、すべての長時間実行されるタスクをキャンセルするScheduledExecutorServiceを使用することができます(あなたが呼び出し可能書を提出したときに作成されている)

ExecutorService service = Executors.newFixedThreadPool(N); 

ScheduledExecutorService canceller = Executors.newScheduledThreadPool(1); 

public void executeTask(Callable<?> c){ 
    final Future<?> future = service.submit(c); 
    canceller.schedule(new Runnable(){ 
     public void run(){ 
      future.cancel(true); 
     } 
    }, SECONDS_UNTIL_TIMEOUT, TimeUnit.SECONDS); 
} 
+0

コールで値を返す必要があります。 –

+1

ありがとう、私はちょうどそれを自由に手書きしたと想像することができます。 Firefoxのみにコンパイラが組み込まれている場合: –

0

あなたは、その起動時間と一緒にご対応先物のリストを得ることができます。

別のタスクでは、定義された時間以上何らかのタスクが実行されているかどうかを毎分チェックし、そうであれば、将来のキャンセル(true)を呼び出します。完了した先物はリストから削除されます。

0

あなたはこの方法

<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, 
           long timeout, 
           TimeUnit unit) 
          throws InterruptedException 

を使用し、1分に最大タイムアウトを設定することができます。あなたのスレッドがそれ以上のものを取るならば、それはちょうど打ち切られます。

5

他の回答と同様に将来の処理を取り消すことができますが、「番号処理」のスレッドが割り込みを処理して正常に終了できることを確認する必要があります。これをブラックボックス操作といいます。スレッドの中断状態がブラックボックス内でアクティブにチェックされていることをどの程度確認していますか?そうでない場合は、割り込みで取り消すことはできません。ブラックボックスは、中断を念頭に置いて書かれている必要があります。

+0

+1には、タスクが何らかの情報を必要とする可能性があることを指摘してください。 – Raedwald

関連する問題