3

したがって、現在、プログラムをスレッドに分割するために使用するかなり基本的なエグゼキュータサービスがあります。

ExecutorService threadPool = Executors.newFixedThreadPool(12);
for (int i = 0; i < objectArray.length; i++) {
    threadPool.submit(new ThreadHandler(objectArray[i], i));
          // The i is used elsewhere
}

「クラッシュした」または「フリーズした」スレッドを検出/閉じるための良い方法があるかどうか疑問に思いましたか?ドキュメントを確認しましたが、これをどのように使用しているかにまったく適合していないようです...

誰かがこれを手伝ってくれますか?ありがとう

4

3 に答える 3

3

threadPool.submitFuture<T>Objectを返します。したがって、この将来のオブジェクトを使用して、タスクの実行を処理できます。メソッドを使用isCancelled() and isDoneすると、タスクがキャンセルまたは完了したことを確認できます。さらにget()、interpret、cancel、またはexecutionexceptionで例外をスローするブロッキング呼び出しがあります。

List<Future<?>> list = new ArrayList<Future<?>>();
for (int i = 0; i < objectArray.length; i++) {
    Future<?> task=threadPool.submit(new ThreadHandler(objectArray[i], i));
          // The i is used elsewhere
    list.add(task);
}
for(Future future : list){
   try{
       future.get();
   }catch(CancellationException cx){
   ...
   }catch(ExecutionException ex){
   ...
   }catch(InterruptedException ix){
   ...
   }

}
于 2012-09-06T15:10:34.333 に答える
1

あなたが持っている1つのオプションはを使用することExecutorCompletionServiceです。そのメソッドを介してタスクを実行してからsubmit、別のスレッドにpoll(long timeout, TimeUnit unit)メソッドの完了を待機させます。例外で終了したタスクは、を返します。Futureこれにより、get()がスローされExecutionExceptionます。

タイムアウトを使用すると、タスクが戻る前に時間が経過したことを検出することもできます。ただし、この動作の有用性は、設定によって大きく異なります。

于 2012-09-06T15:27:10.410 に答える
0

キャンセルされたタスクを中断するだけです。ScheduledExecutorServiceを使用して、キャンセルするタスクをスケジュールできます。

コードが割り込みを尊重しない場合は、それが尊重されるように修正する必要があります。これは、信頼できる方法に近い方法でプログラムで回避するのは非常に困難です。

于 2012-09-06T15:06:38.170 に答える