2

ExecutorService新しいスレッドを生成する代わりに、既存のスレッドが実行を実行できるようにするものはありますか?それがScheduledExecutorの場合はボーナス。ほとんどのエグゼキュータは実行を行うためにワーカースレッドを生成しますが、ワーカースレッドを現在の既存のスレッドにします。これが私が想像するAPIです:

while (!executor.isTerminated()) {
    Runnable r = executor.take();
    r.run();
}

これは、イベントを処理するために独自のイベントディスパッチスレッドを生成する必要があるSwingとは対照的に、SWTおよびJavaFXがメインスレッドにイベントのディスパッチを許可する方法に似ています。

動機:現在、スレッドが新しいエグゼキュータを生成し、それが終了するのを待つためにawaitTermination()を呼び出す場所がたくさんあります。いくつかのリソースを節約し、スタックトレースが2つに分割されないようにしたいと思います。

execute(Runnable)の呼び出し元スレッドでタスクを実行するエグゼキュータは必要ないことに注意してください。これは、この回答とGuavaがMoreExecutors.sameThreadExecutor()行うことです。

4

2 に答える 2

3

java.util.concurrent のほとんどのエグゼキュータは、想定どおりに動作します。タスクが多すぎる場合に追加のスレッドを生成するものもありますが、通常は制限を設定するように構成できます。

このような振る舞いを悪用するには、毎回新しいエグゼキューターを起動しないでください。同じエグゼキューターを使用してください。一連のタスクが完了するのを待つには、invokeAll()またはsubmit()を使用してからfuture.get () を使用します。

于 2012-09-17T17:46:51.040 に答える
0

名前、デーモンステータスなど、新しいスレッドの作成を制御する必要があると思います。次を使用しThreadFactoryます。

public class MyThreadFactory implements ThreadFactory {
    public Thread newThread(Runnable runnable) {
        Thread t = new Thread(runnable, "MyThreadName");
        t.setDaemon(true);
        return t;
    }
}

これにより、スレッドの作成を制御して、デフォルトのデフォルト スレッドの代わりに、作成したスレッドで実行が行われるようにすることができThreadFactoryます。

次に、それを使用するには、すべてのメソッドが次のようにExecutorsなりますThreadFactory

Executors.newExecutorOfSomeKind(new MyThreadFactory());

編集:あなたの言いたいことがわかりました。残念ながら、すべてのExecutor実装の動作 (私が知る限り) は、sameThreadExecutorあなたが言及したものを除いて、タスクを実行するための新しいスレッドを作成することです。1 つのタスクを実行するためだけにエグゼキュータを作成しているオブジェクトを調べなければThread(これは恐ろしい設計です。これが何を意味するかについてはコメントを参照してください)、目的を達成する簡単な方法はありません。コードを変更して、 (この質問Executorを参照)のような単一のものを使用するか、フォーク/結合パターンを使用することをお勧めします。Java 7 では fork/join が簡単になりました (この Java Trailを参照してください)。Java 7 より前のコードについては、Java でのカウント(および一般的な) を参照してください。ExecutorCompletionServiceSemaphore

于 2012-09-17T17:37:12.630 に答える