実行時間の長いスレッドにExecutorServiceを使用する理由


8

プロセスの存続期間中実行し続けるデーモンスレッドを生成するオブジェクトが必要です。議論のために、それは組み込みシステムのスレッドであり、いくつかの診断ポートでコマンドを受信して​​処理するのを待機しているとしましょう。しかし、それは本当に何でもあり得ます。主なアイデアは、長期間にわたって何かを見ているということです。一連のタスクを実行していません。

一般的なJavaの知恵によると、「インスタンス化しないThreadでくださいExecutorService。代わりに使用してください」です。(例えば、この答えを見てください)しかし、利点は何ですか?単一の長期実行スレッドを作成する手段としてスレッドプールを使用しても、意味がないようです。私がこれを書いた場合よりどのように良いでしょうか?

class Foobar {
    public Foobar() {
        this.threadFactory = Executors.defaultThreadFactory();
        ...
    }

    public Foobar(ThreadFactory threadFactory) {
        this.threadFactory = threadFactory;
        ...
    }

    public void start() {
        fooThread = threadFactory.newThread(new Runnable() { ... });
        fooThread.setDaemon(true);
        fooThread.start();
    }
    ...
}

注:この質問は私の質問に似ていますが、答えはスレッドプールの使用方法のみを示し理由は述べていません。



Javaについてはわかりませんが、他の言語では通常、実行時間の長いスレッドのスレッドプールを回避することを明示的に推奨しています。ご存じのとおり、限られた数のリソースの1つを長期間使用しても意味がありません。
フランクヒルマン2017年

回答:


11

「ネバー」は強すぎる言葉だと思います。それは、最適化の2番目のルールである「(まだ)しない」に似ています。

私の意見では、executorサービスを使用する主な理由は、実行中のスレッドの数を管理することです。任意のクラスが独自のスレッドを作成することを許可すると、1,000のCPUバウンド(または常にコンテキスト切り替え)のスレッドがすぐに見つかる場合があります。executorサービスは、スレッドの作成に制約を提供することにより、この問題を解決します。

2番目の理由は、スレッドを適切に開始するには、いくつかの考慮が必要であることです。

  • デーモンか非デーモンか?これを間違えるとSystem.exit()、プログラムをシャットダウンするために呼び出す必要があります。
  • 何を優先しますか?多くのSwingプログラマーは、CPUを多用するタスクを処理するためにバックグラウンドスレッドをスピンアップすることで賢いと思っていましたが、イベントディスパッチスレッドが最高の優先度で実行され、子スレッドが親の優先度を継承することを理解していませんでした。
  • キャッチされない例外に対処する方法は?
  • 適切な名前は何ですか?名前にこだわるのはばかげているように見えますが、目的に名前を付けたスレッドはデバッグに多くの助けを与えます。

とはいえ、スレッドプールに依存するのではなく、スレッドを起動する方が適切な場合もあります。

  • アプリケーションがタスク生成していて、それらのタスクの実行方法を制御したい場合は、スレッドプールを使用します。
  • 私は、1つまたはいくつかのスレッドが外部で生成されたイベントの処理専用である専用スレッドを作成します。

「外部生成」はコンテキストに依存します。古典的なケースは、メッセージキューまたはソケットの最後にあるスレッドで、そのキューをポーリングし、何らかのアクション(タスクをプールにディスパッチすることを含む)を実行する必要があります。

ただし、特定のモジュールの外部で生成されたイベントを参照することもできます。たとえば、AsyncAppenderアプリケーションがプールを提供することを期待するのではなく、Log4J が独自のスレッドを起動することは完全に合理的であると考えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.