2017-05-23 12 views
0

私はそれをキャンセルする能力を持つ単一のスレッドだけを実行する必要があります。私はFuture<T>を使ってこれを達成できることを発見しました。今、私はこのようにそれを使用する:ExecutorService sは通常、複数のスレッドを管理するために使用されているので、1を作成せずにこれを達成するためのより効率的な方法があった場合ExecutorServiceを作成せずにスレッドを1つしか実行せずにFutureを受け取る方法は?

ExecutorService executorService = Executors.newSingleThreadExecutor(); 
Future<Void> future = executorService.submit(copyCallable); 
executorService.shutdown(); 

、私は思っていました。ありがとう。

+0

'ExecutorService'は作成されたスレッドのキャンセルに役立ちません。あなた自身でそれを管理する必要があります。出力を待つことに関しては、呼び出し元スレッドで 'new thread()。join()'を呼び出すことができます。 – 11thdimension

+0

アンドロイドクラス[AsyncTask](https://developer.android.com/reference/android/os/AsyncTask.html)がこれ用に作られています。通常、AsyncTask.doInBackground()が終了すると、一度に1つのAsyncTaskがguiスレッドの外部で実行され、AsyncTask.onPostExecuteはguiスレッドで実行されます。 – k3b

+0

なぜそれが効果的かどうかは気になりますか?あなたのやり方は、あなたの時間を効率的に使うように見えます。それ以外のコードは、もっと多くのコード行を書く必要があり、他のプログラマーにはいつかより多くのコード行を読み込ませるようになるかもしれません。あなたのプログラムのパフォーマンスは不満ですか?そうでない場合は、あなたがいる場所を止めてそれに満足してみませんか? –

答えて

0

Interryprionは、スレッドと呼び出しの両方のメソッドによって実装されます。スレッドは、InterruptedExceptionをリッスンするか、または都合のよい時点で割り込みフラグをチェックする必要があります。呼び出しコードは、スレッドを停止する必要があることを通知するためにt.interrupt()を呼び出す必要があります。

+0

これは、私が扱う必要がある 'cancel()'機能のためだけに 'Future'を使用していました。通常のスレッドと同様に、通常のスレッドを使うかもしれません。ありがとう! –

関連する問題