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