18

Java プログラムでスレッドだけでなく Executor を使用する利点は何ですか。

そのような

ExecutorService pool = Executors.newFixedThreadPool(2);
void someMethod() {
    //Thread
    new Thread(new SomeRunnable()).start();

    //vs

    //Executor
    pool.execute(new SomeRunnable());
}

エグゼキューターは、一度に実行できるスレッドの数を制限するだけですか (スレッドプーリング)? 代わりに、作成するスレッドにランナブルを実際に多重化しますか? そうでない場合は、毎回 new Thread(runnable).start() を記述する必要がないようにするための単なる方法ですか?

4

5 に答える 5

7

はい、エグゼキューターは通常、作成したスレッドにランナブルを多重化します。一度に実行されるスレッドの数を制限および管理します。これにより、同時実行レベルのカスタマイズがはるかに簡単になります。一般に、単にベア スレッドを作成するよりもエグゼキュータを優先する必要があります。

于 2013-08-28T19:52:55.750 に答える
5

新しいスレッドの作成にはコストがかかります。Executors はスレッド プールを使用するため、スレッドを簡単に再利用できるようになり、パフォーマンスが向上します。

于 2013-08-28T19:54:15.520 に答える
2

エグゼキューターは、一度に実行できるスレッドの数を制限するだけですか (スレッドプーリング)?

Executors#newFixedThreadPool(int)Executors#newSingleThreadExecutorこれをそれぞれ異なる条件で実行します(詳細については、適切な javadoc を参照してください)。

代わりに、作成するスレッドにランナブルを実際に多重化しますか?

はい

そうでない場合は、毎回 new Thread(runnable).start() を記述する必要がないようにするための単なる方法ですか?

ExecutorServiceスレッドの処理方法を制御するのに役立ちます。もちろん、これは手動で行うこともできますが、一からやり直す必要はありません。また、インスタンスExecutorServiceを使用して非同期タスクを実行するような機能を提供する他の機能もあります。Future

于 2013-08-28T19:55:26.820 に答える
-1

関連する質問で述べたように、スレッドはかなり悪いです。Executor (および関連する同時実行クラス) は非常に優れています。

警告: ここでは、未加工のスレッドの使用を強くお勧めしません。私は Callables と FutureTasks の使用を非常に好みます (javadoc から: 「キャンセル可能な非同期計算」)。タイムアウトの統合、適切なキャンセル、および最新の同時実行サポートのスレッド プーリングはすべて、生のスレッドの山よりもはるかに便利です。

たとえば、私は現在、ループ内で実行されているばらばらの Thread を使用していた従来のコードをセルフタイマーに置き換えて、各反復後に Thread.sleep() を実行する時間を決定しています。私の置き換えでは、非常に単純な Runnable (単一の反復を保持するため)、ScheduledExecutorServiceを使用して反復の 1 つを実行し、 scheduleAtAFixedRateメソッドから得られるFutureを使用して反復間のタイミングを調整します。

置き換えはレガシーコードと事実上同等であると主張することができますが、私はスレッド管理の難解なうなり声と希望的観測を、GUI の懸念 (現在実行中ですか?) とデータ処理 (5 倍速での再生) とファイル管理 (この実行をキャンセルして別のファイルを選択)。

于 2013-08-28T20:06:56.677 に答える