ホームページ  >  記事  >  Java  >  Java スレッド プール フレームワーク

Java スレッド プール フレームワーク

高洛峰
高洛峰オリジナル
2017-02-11 16:52:461288ブラウズ

この記事では主にJavaスレッドプールフレームワークの関連知識を紹介します。とても良い参考値ですので、下のエディタで見てみましょう

1. スレッドプールの構造図

Java 线程池框架

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 スレッド実行処理

Java 线程池框架

3.3 スレッドサイズの決定: cpu集中型: できるだけ少ないスレッドを開きます。最適なスレッド数はNcpu+1です

io集中型: 複数のスレッドを開き、2Ncpu

混合: 状況に応じて、次のように分割できます。 io 集中型と cou 集中型

Java スレッド プール フレームワークに関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。