ExecutorServiceのは、Javaでメソッドを実行します

プレルナ・グプタ:

よるRunnable executeにおける方法Executor、JAVAドキュメントを対応することと述べて:

将来のある時点で指定されたコマンドを実行します。コマンドは、{@code執行}実装の裁量で、プールされたスレッドに、または呼び出したスレッドに、新しいスレッドで実行することができます。

我々はエグゼキュータのサービスなどを作成する場合私の疑問は、例えば、

ExecutorService executor = Executors.newFixedThreadPool(5);

そして作成しRunnableたタスクを、上でそれを実行executeする方法として:

Runnable testRunnableTask = () ->  {
      Runnable testRunnableTask = () ->  {
          System.out.println("my tested function");
      } 
 };
executor.execute(testRunnableTask); 

そして、これはtestRunnableTask我々が固定スレッドプールを通じて初期化したスレッドのいずれかによって実行されなければなりません。しかし、JAVAドキュメントごとのように、新しいスレッドまたはスレッドプールや呼び出しスレッドによって実行することができます。

私の理解は、JAVAドキュメントの正しい場合、なぜ、その後、私の疑いがあるexecuteメソッドは常に他の方法のように、プールからのスレッドのいずれかを使用しないExecutorServiceようにsubmit

Saptarshi Basuさん:

submitによる実行のためにタスクを送信しますexecute言い換えれば、submit内部的に呼び出してexecuteタスクを実行します。

どのようにexecuteタスクがあなたが使用した構成またはコンストラクタに依存して実行されますThreadPoolExecutor

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler)
  1. スレッドの合計数以上である場合にアイドルスレッドが死んでしまいます corePoolSize
  2. 提出されたタスクの数以上ある場合corePoolSizeまで、新しいスレッドが作成され、maximumPoolSize到達しました
  3. handler実装は、すべてのスレッドがタスクを実行している場合に発生し、ウィル決まり飽和ポリシー与え有界ブロッキングキューもいっぱいあるし。渡されたハンドラの実装がある場合はThreadPoolExecutor.CallerRunsPolicy、呼び出し元のスレッドがタスクを実行します
  4. newFixedThreadPool特殊なインスタンスであり、ThreadPoolExecutor下記のように。同じです。飽和ポリシーが提供されていない-ので、デフォルトのポリシーが使用されています。corePoolSizemaximumPoolSizeThreadPoolExecutor.AbortPolicy
return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=28779&siteId=1