この記事では主にJavaスレッドプールフレームワークの関連知識を紹介します。とても良い参考値ですので、下のエディタで見てみましょう
1. スレッドプールの構造図
2. 例
スレッドインターフェースの定義
public class MyThread extends Thread { @Override publicvoid run() { System.out.println(Thread.currentThread().getName() + "正在执行"); } }
1: newSingleThreadExecutor
ExecutorService pool = Executors. newSingleThreadExecutor(); Thread t1 = new MyThread(); Thread t2 = new MyThread(); Thread t3 = new MyThread(); //将线程放入池中进行执行 pool.execute(t1); pool.execute(t2); pool.execute(t3); //关闭线程池 pool.shutdown();
入力結果:
pool-1-thread-1正在执行 pool-1-thread-1正在执行 pool-1-thread-1正在执行
2: newFixedThreadPool
ExecutorService pool = Executors.newFixedThreadPool(3); Thread t1 = new MyThread(); Thread t2 = new MyThread(); Thread t3 = new MyThread(); Thread t4 = new MyThread(); Thread t5 = new MyThread(); //将线程放入池中进行执行 pool.execute(t1); pool.execute(t2); pool.execute(t3); pool.execute(t4); pool.execute(t5); pool.shutdown();
入力結果:
pool-1-thread-1正在执行 pool-1-thread-2正在执行 pool-1-thread-1正在执行 pool-1-thread-2正在执行
3 : newCachedThreadPool
ExecutorService pool = Executors.newCachedThreadPool(); Thread t1 = new MyThread(); Thread t2 = new MyThread(); Thread t3 = new MyThread(); Thread t4 = new MyThread(); Thread t5 = new MyThread(); //将线程放入池中进行执行 pool.execute(t1); pool.execute(t2); pool.execute(t3); pool.execute(t4); pool.execute(t5); //关闭线程池 pool.shutdown();
入力結果:
pool-1-thread-2正在执行 pool-1-thread-4正在执行 pool-1-thread-3正在执行 pool-1-thread-1正在执行 pool-1-thread-5正在执行
4 :ScheduledThreadPoolExecutor
ScheduledExecutorService pool = Executors.newScheduledThreadPool(2); pool.scheduleAtFixedRate(new Runnable() {//每隔一段时间就触发异常 @Override public void run() { //throw new RuntimeException(); System.out.println("================"); } }, 1000, 2000, TimeUnit.MILLISECONDS); pool.scheduleAtFixedRate(new Runnable() {//每隔一段时间打印系统时间,证明两者是互不影响的 @Override public void run() { System.out.println("+++++++++++++++++"); } }, 1000, 2000, TimeUnit.MILLISECONDS);
入力結果:
================ +++++++++++++++++ +++++++++++++++++ +++++++++++++++++
3. スレッドプールコアパラメータ
corePoolSize: プール内のコアのスレッド数
maximumPoolSize: プール内で許可されるスレッドの最大数。
keepAliveTime: スレッドの数がコアよりも大きい場合、これは、過剰なアイドル スレッドが終了するまでに新しいタスクを待機する最大時間です。
unit: keepAliveTime パラメーターの時間単位。
workQueue: 実行前にタスクを保持するために使用されるキュー。このキューは、execute メソッドによって送信された実行可能なタスクのみを保持します。
threadFactory: 新しいスレッドを作成するためにエグゼキュータによって使用されるファクトリ。
handler: スレッドスコープとキュー容量を超えたために実行がブロックされた場合に使用されるハンドラー。
ThreadPoolExecutor: Executors クラスの基礎となる実装。
3.1 タスクキューイングメカニズム
SynchonousQueue: 同期キュー、キューは保持せずに直接スレッド実行に送信されます。このとき、スレッドプールは通常無制限です。スレッド プールのスレッドが到達する 最大数に達すると、新しいタスクがキュー内で実行を待機するため、キューが無限に拡大する可能性があります
ArrayBlockingQueue: リソースの枯渇を防ぐのに役立つ境界付きキュー。タスクが失われる可能性があります
注意: newSingleThreadExecutor、newFixedThreadPoolはLinkedBlockingQueueを使用します
newCachedThreadPoolはSynchronousQueueを使用します
newScheduledThreadPoolはDelayedWorkQueueを使用します
3.2 スレッド実行処理
3.3 スレッドサイズの決定: cpu集中型: できるだけ少ないスレッドを開きます。最適なスレッド数はNcpu+1です
io集中型: 複数のスレッドを開き、2Ncpu
混合: 状況に応じて、次のように分割できます。 io 集中型と cou 集中型
Java スレッド プール フレームワークに関連するその他の記事については、PHP 中国語 Web サイトに注目してください。