九、Javaのマルチスレッドのスレッドプールの概要基礎

まず、スレッドプールは何ですか

1.Java ラインチェンプールが使用され、フィールドアップやシーンの枠組み、およびほとんどすべての非同期要求したり、実行送っいずれかのライン業務プログラムを使用することができますラインチェンプールを。オープンでて送信プロセス、の使用の合理化ラインのパスセルができるテープで。3 良い場所
まず:削減資金源の消費をパスを通して再利用は、すでに作成建て-line 減らすために、プロセスをラインドライブレコードの建設ピン破壊された原因の消費を。
第二:レスポンス改善する必要がある速度をどんなときにタスクの到着、どのタスクがするまで待つ必要がないかもしれないラインチェンチョン建はすぐにすることができるようになります実行の行を。
第三:改善の行に管理プロセスをラインプロセスが不足しているリソースのソースは、無制限の場合作成が構築されていないだけシステム消費システムリソース源を、だけでなく、システム低減システム安定性の使用キャラクタリゼーションワイヤできるパスセルを供給ラインシステムに配布チューニングおよび監視コントロール。しかし、の使用の合理化を達成するためにラインチェン・プールを、それがされるために必要なその実現のよく知ら原則。

第二に、スレッドプールの役割

1.スレッドプールは、効率を改善するために、スレッドを作成し、破壊するために必要な時間を短縮、運用サービスの多数の固定されたスレッドの限られた数によって設計スレッドの多数の突然の流行です。スレッドが非常に長い場合は、スレッドプールを使用する必要はありません(長時間動作させることができないではないが、しかし。べきではありません)。また、我々は、スレッドプール内のスレッド、一時停止、およびサスペンションを開始制御することはできません。

第三に、スレッドプールの分類

1.Javaは本質的に、同時言語をサポートするJavaスレッドプールを提供して頻繁に高い同時実行性と大量のデータで作成されたサポート同時マルチスレッド、スレッドは非常に、消費する資源であることを意味しています。JDK1.5以前のバージョンでは、スレッドプールを使用することは簡単であるが、JDK1.5後、大幅に改善されています。JDK1.5後java.util.concurrentパッケージに入社、java.util.concurrentのパッケージは、並行プログラムを開発する開発者に大きな助けを与え、並行性の問題を解決するために追加されました。そして、エグゼキュータ・インタフェースは、エグゼキュータ・インターフェースは、この記事の下で契約の下で(2004年JDK1.5リリース)非常に古いインターフェースは説明するが、の原則のいくつかのために多くのプログラマがまだ精通していないかのように、これまでこの記事を書きます彼らの知識を統合すると同時に、エグゼキュータ・インターフェースに導入。記事に誤りがある場合は、指摘を歓迎します。

実装の最上位エグゼキュータフレームワークは、newFixedThreadPool、newCachedThreadPool事実、異なるThreadPoolExecutorのみコンストラクタメソッドパラメータThreadPoolExecutorクラス、newScheduledThreadPoolエグゼキュータファクトリクラスが提供されます。異なるパラメータを通過し、スレッドプールは、下の異なるシナリオのために構築することができ、その基本原理は、ThreadPoolExecutorスレッドプールで実行するように、このプロセスを導入し、それを達成する方法です。

corePoolSize:コア・プールのサイズ。タスクが後にある場合は、それがスレッドプール内のスレッドの数がcorePoolSizeに達したときに、タスクが間にキャッシュキューに到達し、タスクを実行するスレッドを作成します
maximumPoolSize:スレッドプール内のスレッドの最大数を、それがスレッドプールで言いましたどのように多くのスレッドが作成でき、
keepAliveTimeがは:スレッドが終了するタスクの実行に長い時間を維持しないことを示しています。
単位:keepAliveTimeがパラメータの時間単位、7つの値は、7種類のクラスの静的プロパティをTIMEUNITあり、存在します。

四、スレッドプールを作成する方法の4種類

1.Javaはそれぞれ、エグゼキュータ(JDK1.5と契約)により4つのスレッドプールを提供しています:

長い治療の必要性、アイドル状態のスレッドを再利用するための柔軟性、そうでない場合はリサイクル可能な、新しいスレッドの場合よりもキャッシュスレッドプール、スレッドプールを作成1.1.newCachedThreadPool。

// 无限大小线程池 jvm自动回收
		ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
		for (int i = 0; i < 10; i++) {
			final int temp = i;
			newCachedThreadPool.execute(new Runnable() {

				@Override
				public void run() {
					try {
						Thread.sleep(100);
					} catch (Exception e) {
						// TODO: handle exception
					}
					System.out.println(Thread.currentThread().getName() + ",i:" + temp);

				}
			});
		}

 要約 第2のタスクは、スレッドが毎回新しいスレッドではなく、最初のタスクが複雑になり実行するために使用される場合、スレッドプールは無限大であるが、最初のタスクが完了しています。

固定サイズのスレッドプールを作成1.2.newFixedThreadPool、あなたは同時スレッドの最大数を制御することができ、余分なスレッドは、キュー内で待機します。

ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(5);
		for (int i = 0; i < 10; i++) {
			final int temp = i;
			newFixedThreadPool.execute(new Runnable() {

				@Override
				public void run() {
					System.out.println(Thread.currentThread().getId() + ",i:" + temp);

				}
			});
		}

概要:3のスレッドプールのサイズ、各タスクの出力インデックス睡眠2秒、3デジタル印刷2秒ごとにので。固定長スレッドのサイズは、システム・リソースに応じて最良のセットをプール。Runtime.getRuntime()。AvailableProcessors()

 定期的かつ定期的なタスクの実行をサポートするために、固定サイズのスレッドプールを作成します1.3.newScheduledThreadPool。

ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(5);
		for (int i = 0; i < 10; i++) {
			final int temp = i;
			newScheduledThreadPool.schedule(new Runnable() {
				public void run() {
					System.out.println("i:" + temp);
				}
			}, 3, TimeUnit.SECONDS);
}

概要:3秒で実行する遅延を表します。 

1.4.newSingleThreadExecutorシングルスレッドのスレッドプールを作成し、すべてのタスクが指定された順序(FIFO、LIFO、優先度)で行われることを保証するために、タスクのみワーカースレッドを実行するためだけにそれを使用。

ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();
		for (int i = 0; i < 10; i++) {
			final int index = i;
			newSingleThreadExecutor.execute(new Runnable() {

				@Override
				public void run() {
					System.out.println("index:" + index);
					try {
						Thread.sleep(200);
					} catch (Exception e) {
						// TODO: handle exception
					}
				}
			});
		}

注: 結果を順次出力、各タスクのための実装に相当します。 

第五に、スレッドプールの原則

1.corePoolSize(カーネルスレッド):スレッドの実用的なアプリケーションの数を指します。

   maximumPoolSize(スレッドの最大数):作成するスレッドプール内のスレッドの数。

スレッドプール内のスレッドの現在の数がcorePoolSize未満である場合2.、各タスクには、このタスクを実行するスレッドを作成します。

さらには、失敗した場合には(;現在のスレッドプール内のスレッド数> = corePoolSizeは、その後、各タスクに、正常に追加された場合、タスクはそれを実行するために待機しているアイドル状態のスレッドになりますタスクキューバッファに追加しようとした場合一般的にはタスクバッファキューがいっぱいになっている)、それはこのタスクを実行するために、新しいスレッドを作成しようとします。

キューがいっぱいの場合、maximumPoolSizeよりもないのを前提としたスレッドの合計数は、その後、新しいスレッドを作成します

スレッドプール内のスレッドの現在の数がmaximumPoolSizeに達した場合、それはタスクが政策過程を拒否かかります。

プール内のスレッドの数がcorePoolSizeよりも大きい場合にはアイドル時間がkeepAliveTimeがにスレッドを超えた場合、プール内のスレッドの数がcorePoolSizeより大きくなくなるまで、スレッドは停止され、芯糸に配置された生存時間をプールすることが許可されている場合、その後、コアセルスレッドがkeepAliveTimeがより多くのために、スレッドが終了するアイドル状態です。

シックス・カスタムスレッドプールのコード

public class Test0007 {

	public static void main(String[] args) {
		// Executors.newCachedThreadPool();
		//提交一个任务到线程池中,线程池的处理流程如下:
		//1、判断线程池里的核心线程是否都在执行任务,如果不是(核心线程空闲或者还有核心线程没有被创建)则创建一个新的工作线程来执行任务。如果核心线程都在执行任务,则进入下个流程。
		//2、线程池判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了,则进入下个流程。
		//3、判断线程池里的线程是否都处于工作状态,如果没有,则创建一个新的工作线程来执行任务。如果已经满了,则交给饱和策略来处理这个任务。

		ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 2, 60L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(3));
		for (int i = 1; i <= 6; i++) {
			TaskThred t1 = new TaskThred("任务" + i);
			executor.execute(t1);
		}
		executor.shutdown();
	}
}

class TaskThred implements Runnable {
	private String taskName;

	public TaskThred(String taskName) {
		this.taskName = taskName;
	}

	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName()+taskName);
	}

}

THE OF結論

常に信念を貫きます!!!

公開された122元の記事 ウォン称賛64 ビュー50000 +

おすすめ

転載: blog.csdn.net/chenmingxu438521/article/details/103839690