spring bootではjavaスレッド池ExectorServiceを使用します.
1.javaスレッド池を知っています.
1.1スレッド池はどのような場合に使いますか?.単一タスク処理の時間が短い .処理したいジョブの数は です.
1.2スレッド池を使用するメリット:.スレッドの作成と廃棄にかかる時間とシステムリソースのオーバーヘッドを低減する ..スレッド池を使わないと、システムが大量のスレッドを作成し、システムメモリ を消費してしまう恐れがある.
1.3スレッド池は以下の4つの基本構成部分を含む.、スレッド池マネージャ(ThreadPool):スレッド池を作成して管理するためのもので、スレッド池を作成することと、スレッドプールを破壊することと、新しいタスクを追加することとを含む. 、ワークスレッド(PoolWorker):スレッドのプールでは、スレッドは、タスクがないときは待機状態にあり、ループしてタスクを実行することができます. 、タスクインターフェース(Task):各タスクが必ず実行されるインターフェースは、ワークスレッドスケジューリングタスクの実行のために、主にタスクの入口を規定し、タスクが完了した後の終了作業、タスクの実行状態などを規定する. 、タスクキュー:未処理のタスクを格納するために使用されます.バッファ機構を提供します. 1.4スレッド池のコアパラメータ
ThreadPool Exectorは4つの構造方法があります.最初の3つは最後の呼び出しです. corePoolSize:コアスレッド数 コアスレッドは常に生きています.タスクがなくても を実行する必要があります.スレッド数がコアスレッド数より小さい場合、スレッドが空き状態であっても、優先的に新しいスレッド処理 を作成する.にallowCoreThed Timeout=trueを設定すると、コアスレッドがタイムアウトして がオフになります.
maxPoolSize:最大スレッド数 スレッド数>=corePoolSizeで、ジョブキューがいっぱいになったとき.スレッド池は新しいスレッドを作成してタスクを処理します. スレッド数=maxPoolSizeで、ジョブのキューがいっぱいになった場合、スレッドプールはジョブの処理を拒否して、異常 をスローします.
keep Alive Time:スレッド空き時間 スレッドの空き時間がkeep Alive Timeに達すると、スレッド数=corePoolSize までスレッドが終了します. allowCoreThed Timeout=trueの場合、スレッド数=0 まで
workQue:一つのブロック列は、実行待ちのタスクを格納するために使用され、このパラメータの選択も重要であり、スレッドプールの動作過程に大きな影響を与える.一般的に、ここのブロック列は以下のような選択がある. ArayBlocking Que; Linked Blocking Que; Synch ronousQue;渋滞行列についてはこれを見てもいいです.java渋滞行列 threadFactory:スレッド工場は主にスレッドを作成するために使用されます. rejectedExectionHandler:ジョブ拒否プロセッサ、2つの場合は処理タスクを拒否します. スレッド数がmaxPoolSizeに達したとき、切断列がいっぱいになりました.新しいタスク を拒否します.スレッドのプールがshutdown()に呼び出されると、スレッドの池のタスクが実行されるのを待って、shutdownに戻ります.shutdown()とスレッドプールの本当にshutdown間でタスクを提出すると、新しいタスク を拒否します.
は、ジョブの処理を拒否すると、スレッド池がrejectedExectionHandlerを呼び出してこのタスクを処理します.デフォルトがAbortPolicyに設定されていないと、異常が発生します.ThreadPool Exector類にはいくつかの内部実装類があります. AbortPolicy廃棄タスク、スロー運転時異常 CallerRunsPolicy実行タスク DisccardPolicy無視して、何も起こらないです. DisccardOldest Policyは、最初にキューに入る(最後の実行)タスク をキューから蹴った.は、RejectedExectionHandlerインターフェースを実現し、カスタムプロセッサ を提供することができる.
1.5 Javaスレッド池ExectorService Exectors.newCachedThreadPoolはキャッシュ可能なスレッドプールを作成し、スレッド長が処理の必要を超えている場合、空きスレッドを柔軟に回収でき、回収できない場合は新しいスレッドを作成する. Exectors.newFixedThreadPoolは、スレッドの最大の同時数を制御し、オーバーしたスレッドはキューの中で待機します. Exectors.newScheduledThreadPoolは定長線のプログラムプールを作成し、タイミングと周期的なタスクの実行をサポートします. Exectors.newSingleThreadExectorは、単一ラインのプロセス化されたスレッドプールを作成します.これは唯一のワークスレッドでのみタスクを実行し、すべてのタスクが指定された順序(FIFO,LIFO,優先度)で実行されることを保証します. 備考:Exectorsは一つの工場類にすぎません.そのすべての方法はThreadPoolExector、ScheduledThreadPoolExectorの二つの種類の例です.
1.6 ExectorServiceは以下のいくつかの実行方法があります. exectorService.execute;この方法は、Runnableの例を受信し、非同期的に を実行する. exectorService.submit(Runnable) exectorService.submit exector Service.invokeAny(…) exector Service.invokeAll(…) execute(Runnable)
この方法は、Runnableの例を受信し、非同期的に実行する.
submit(Runnable)とexecute(Runnable)の違いは前者がFutureオブジェクトに戻り、Futureオブジェクトに戻ることで、提出されたジョブの実行が完了したかどうかを確認できます.以下の例を見てください.
submitはsubmit(Callable)とsubmit(Runnable)と同様に、Futureオブジェクトを返すこともあるが、この他に、submit(Callable)が受信したのはCallableの実現であり、Callableインターフェースのcall(call)方法はリターン値があり、タスクの実行結果に戻ることができます.次の例を見てください.
invokeAny(…)
invokeAny(…)メソッドはCallableのセットを受信し、この方法を実行するとFutureに戻りませんが、全てのCallableタスクのうちの一つのタスクの実行結果を返します.この方法では、どのタスクの実行結果が返ってくるかは保証できません.いずれかです.
invokeAll(…)もinvokeAny(…)と同様に、Callableのセットを受信したが、前者は実行後にFutureのListに戻り、Callableごとのタスク実行後のFutureオブジェクトに対応する.
2.1 springBootの使用構成
@serviceにExectorServiceを注入して直接使うことができます.
1.1スレッド池はどのような場合に使いますか?
1.2スレッド池を使用するメリット:
1.3スレッド池は以下の4つの基本構成部分を含む.
ThreadPool Exectorは4つの構造方法があります.最初の3つは最後の呼び出しです.
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
threadFactory, defaultHandler);
}
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
RejectedExecutionHandler handler) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), handler);
}
//
public ThreadPoolExecutor(//
int corePoolSize,
//
int maximumPoolSize,
//
long keepAliveTime,
//
TimeUnit unit,
//
BlockingQueue workQueue,
//
ThreadFactory threadFactory,
// ,
RejectedExecutionHandler handler ) {
if (corePoolSize < 0 ||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime < 0)
throw new IllegalArgumentException();
if (workQueue == null || threadFactory == null || handler == null)
throw new NullPointerException();
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}
主なパラメータ1.5 Javaスレッド池ExectorService
1.6 ExectorServiceは以下のいくつかの実行方法があります.
この方法は、Runnableの例を受信し、非同期的に実行する.
executorService.execute(new Runnable() {
public void run() {
System.out.println("Asynchronous task");
}
});
executorService.shutdown();
submit(Runnable)submit(Runnable)とexecute(Runnable)の違いは前者がFutureオブジェクトに戻り、Futureオブジェクトに戻ることで、提出されたジョブの実行が完了したかどうかを確認できます.以下の例を見てください.
Future future = executorService.submit(new Runnable() {
public void run() {
System.out.println("Asynchronous task");
}
});
future.get(); //returns null if the task has finished correctly.
submit(Callable)submitはsubmit(Callable)とsubmit(Runnable)と同様に、Futureオブジェクトを返すこともあるが、この他に、submit(Callable)が受信したのはCallableの実現であり、Callableインターフェースのcall(call)方法はリターン値があり、タスクの実行結果に戻ることができます.次の例を見てください.
Future future = executorService.submit(new Callable(){
public Object call() throws Exception {
System.out.println("Asynchronous Callable");
return "Callable Result";
}
});
System.out.println("future.get() = " + future.get());
ミッションが完了すれば、future.get()メソッドはCallableタスクの実行結果に戻ります.なお、future.get()方法はブロックされます.invokeAny(…)
invokeAny(…)メソッドはCallableのセットを受信し、この方法を実行するとFutureに戻りませんが、全てのCallableタスクのうちの一つのタスクの実行結果を返します.この方法では、どのタスクの実行結果が返ってくるかは保証できません.いずれかです.
ExecutorService executorService = Executors.newSingleThreadExecutor();
SetString>> callables = new HashSetString>>();
callables.add(new Callable<String>() {
public String call() throws Exception {
return "Task 1";
}
});
callables.add(new Callable<String>() {
public String call() throws Exception {
return "Task 2";
}
});
callables.add(new Callable<String>() {
public String call() throws Exception {
return "Task 3";
}
});
String result = executorService.invokeAny(callables);
System.out.println("result = " + result);
executorService.shutdown();
invokeAll(…)invokeAll(…)もinvokeAny(…)と同様に、Callableのセットを受信したが、前者は実行後にFutureのListに戻り、Callableごとのタスク実行後のFutureオブジェクトに対応する.
List> futures = executorService.invokeAll(callables);
for(Future future : futures){
System.out.println("future.get = " + future.get());
}
executorService.shutdown();
2.springBootにjavaスレッド池ExectorServiceを使用する2.1 springBootの使用構成
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* , Spring ExecutorService .
* @author Bruce
* @date 2017/2/22
*
* update by Cliff at 2027/11/03
*/
@Configuration
public class ThreadPoolConfig {
@Bean
public ExecutorService getThreadPool(){
return Executors.newFixedThreadPool();
}
}
2.2使用@serviceにExectorServiceを注入して直接使うことができます.
@Autowired
private ExecutorService executorService;
public void test(){
executorService.execute(new Runnable() {
public void run() {
System.out.println("Asynchronous task");
}
});
}
参考:https://www.cnblogs.com/dolphin0520/p/3932921.html https://www.cnblogs.com/waytobestcoder/p/5323130.html