Java開発ノート(105)いくつかのタイマースレッドプール

一般的な使用のスレッドプールの前に導入され、それはほとんどのタスクで、彼らは、高々 、早く仕上げ初期の結果の希望、特定の実行タイミングのための特別な要件はありません。しかし、タスクが必要ですの定期的な実施のために、彼らは、特定の時点で実行され、多くの場合、複数回実行するだけでなく、定期的に繰り返し実行するために必要です。一般的なスレッドプールので、このような定期的な操作の必要性を満たし、そのためにも、タスクを実行するためにタイマー機能のタイミング・サイクルを達成するためのJavaスレッド・プールを提供することはできません。
ExecutorServiceのと呼ばれるツールの一般的なスレッドプール、タイマースレッドプールのユーティリティクラスは、それが計画され、事前に配置されたスレッド・プールであることを示す、スケジュールプレフィックスを追加、ScheduledExecutorServiceと呼ばれています。シングルスレッドタイマースレッドプールとタイマスレッドプールの固定数:唯一の2つのカテゴリに分類共通スレッドプールスレッドプールタイマーの4つのカテゴリに分類とは異なり。この方法により得られた前記シングルスレッドのスレッドプールタイマnewSingleThreadScheduledExecutor、それは次のサンプルコードを作成します。

		//タイマ遅延を作成シングルスレッド
		ScheduledExecutorServiceプール=(ScheduledExecutorService)Executors.newSingleThreadScheduledExecutor( );

 

タイマーの固定された数の次のサンプルコードを作成newScheduledThreadPoolスレッドプール法により得られます。

		//マルチスレッド(スレッドプールのサイズ3)のタイマ遅延時間作成
		ScheduledExecutorServiceプール=(ScheduledExecutorService)Executors.newScheduledThreadPool(3)。

 

2つだけタイマースレッドプールの種類が、タイマーができるだけ多くは、主に以下のように詳細に説明分割を開始し、サイクル長の数に基づいているスケジューリングの3つの方法があります:
1は、定期的なタスクは、一度だけ起動します。
このとき、呼び出し側スレッドプールオブジェクトのスケジュール方法、第1の方法は、タスクインスタンスのパラメータであり、2番目と3番目のパラメータは、長さと遅延実行単位です。
図2に示すように、タイミングサイクルの時間間隔の複数のタスクを開始します。
このとき、呼び出し側スレッドプールオブジェクトscheduleAtFixedRateメソッドは、最初のパラメータは、メソッドのタスクインスタンスは、第二パラメータは第四パラメータと比較し、パラメータが以降の実行のための第三の長い間隔であり、実行の最初の時間の長さ、です長い単位。
図3は、一定の遅延時間の複数のスケジュールされたタスクを開始します。
この時点で呼び出し側スレッドプールオブジェクトscheduleWithFixedDelay法、同じscheduleAtFixedRate方法の基本的なパラメータに記載の方法。その2つの方法の間の差:前者の時間間隔は、タスク上の区間終了時刻から算出されたタスクの開始時刻から計算されます。
それは、もともとExecutorServiceの由来であったため、これらの3つのスケジューリング方法に加えて、ScheduledExecutorService ExecutorServiceのも、ああ来る、などgetPoolSize、getActiveCount、シャットダウン、を含む方法、のすべてを持っています。

ここでの実験は、主に営業時間、操作スレッドの操作説明を含め、現在の操作ログ情報を印刷するために使用される、実験の開始を訪問する使命を定義する前に、プロセスを実行するために、2つのタイマーのスレッドプールを見て。訪問タスクのコード例を以下に示します。

	//タスク訪問の定義
	プライベート訪問静的クラスを実装したRunnable { 
		プライベート文字列名; //タスクの名前
		プライベートint型のインデックス; //数タスク
		公共訪問{(文字列名、int型のインデックス)
			this.name =名; 
			this.index指数= ; 
		} 
		
		@Override 
		公共ボイドRUN(){ 
			//操作時間、操作情報記載スレッドの動作を含む、以下の印刷動作をログ
			文字列DESC = String.Formatの(「号訪問の%D%のタスク」、名前、索引)
			。PrintUtils.print(にThread.currentThread()のgetName()、DESC); 
		} 
	};

 

シングルスレッドのタスクのタイミングを行うスケジュールタイマースレッドプールメソッドを呼び出すコマンドを次のように、特定の実験的なサンプル・コードは次のとおりです。

	//シングルスレッド遅延タイマテスト
	プライベート静的ボイドtestSingleScheduleOnceを(){ 
		//タイマーシングルスレッドの時間遅延作成
		プール=(ScheduledExecutorService)Executors.newSingleThreadScheduledExecutorを()ScheduledExecutorServiceを、
		(I = 0 int型のために、私は<5 ; I ++){//ループ、スケジュール5実施
			//を訪問ミッション作成
			訪問訪問=新しい訪問(「シングルスレッドのタイマー遅延時間」、i)を; 
			//スレッドプールコマンドタスクのスケジューリングを実行すること。来院1秒の遅延の後に実行されるタスク
			pool.schedule(TimeUnit.SECONDSを,.訪問1); 
		} 
	}

 

以上の実験のコードを実行し、スレッドプールは、次のログを観察しています。

15:49:訪問の後、スレッド0タスク16.122プール-1スレッド1遅延タイマ
1つの16.123プール-1-スレッドの 1 15:49:シングルスレッドのタイマー遅延時間訪問タスク
15:49:16.123プール-1 -thread-1 シングルスレッドの二つのタスクの遅延タイマ訪問
15:49:16.124プール-1 -thread-1 つの遅延第3のタイマタスクは、スレッドへの訪問
49:15 16.124プール-1 -thread-1 の訪問のシングルスレッドの遅延タイマーを4つのタスク

 

ログから見て、始めから終わりまでのタイマースレッドプールは一つだけのスレッドの実行があります。

タイマースレッドプールのテスト再び固定数、scheduleAtFixedRateメソッド呼び出しにこのとき、固定周波数周期タスク実行タイミングを調製以下のように、特定の実験サンプルコードです。

	//テスト固定レートマルチスレッドタイマー
	プライベート静的ボイドtestMultiScheduleRate(){ 
		//タイマー(スレッドプールのサイズ3)マルチスレッド固定レートを作成
		ScheduledExecutorServiceプール=(ScheduledExecutorService)Executors.newScheduledThreadPool(3)、 用私は<5; I = 0 int型 、iは++){// ループ行なっ5、スケジュール
			//訪問ミッション作成
			訪問訪問=新しい訪問(「固定金利マルチスレッドタイマー」を、i)は、
			//コマンドを実行するスレッドプールタスクのスケジューリング。最初の訪問は、すべての訪問の間隔は、タスク実行3秒後1秒後のタスクの実行を遅延させる
			、pool.scheduleAtFixedRateを(,. 1 ,. 3、TimeUnit.SECONDSを入手します)
		} 
	}

 

以上の実験のコードを実行し、スレッドプールは、次のログを観察しています。

15:50:0マルチスレッドタイマータスク固定金利への訪問の21.859プール-1スレッド1 
1 21.859プール-1-スレッドの 2 固定金利マルチスレッド・タイマ:15:50訪問タスク
午後3時50:21.859秒タスクマルチスレッドタイマプール1スレッド3の固定レートへの訪問
15:50:21.860プール-1 -thread-3 複数の固定レート第3のタイマタスクは、訪問スレッド
15時50分:4タスク固定金利にマルチスレッディングタイマー21.861プール-1スレッド3を訪問
15:50:24.790プール1 -thread -3最初のタスクのマルチスレッド・タイマ固定レート訪問
15時50分:24.791第タスクマルチスレッドタイマプール-1スレッド3固定レートへの訪問
15時50分:タイマ24.792プール-1スレッド3の固定レートを訪問マルチスレッド第タスク
50:15:24.793プール1 -thread-2 の固定レートマルチスレッドタイマータスクこの第二の旅行
の訪問タイママルチスレッド0タスク24.798プール-1-スレッド-1固定金利:15時50分

 

ログから見ると、タイマースレッドプールは、定期的なタスクを実行するために、3つのスレッドの合計を開き、ログ間隔の前と後の各タスク3秒未満、わずか3秒は二つの実験前と後な間隔を説明するの終わりではないことを指摘しています。

次いで、この方法は、具体的な実験のサンプルコードのようになり、定期的に定期的なタスクを実行するために、定期的にしてみてくださいscheduleWithFixedDelayを呼び出し、次のとおりです。

	//テストマルチスレッド固定遅延タイマー
	プライベート静的ボイドtestMultiScheduleDelay(){ 
		//タイマー(スレッドプールのサイズ3)マルチスレッド固定レートを作成し
		、ScheduledExecutorServiceプール=(ScheduledExecutorService)Executors.newScheduledThreadPool(3) 用私は<5; I = 0 int型 、iは++){// ループ行なっ5、スケジュール
			//訪問ミッション作成
			訪問訪問=新しい訪問(「固定遅延マルチスレッドタイマー」、I); 
			//コマンドは、スレッドプールを実行するためにタスクのスケジューリング。1秒後のタスクの実行を遅延させる最初の訪問は、訪問後3秒ごとに作業を行い
			、(TimeUnit.SECONDSを,. 1 ,. 3訪問)pool.scheduleWithFixedDelayを
		} 
	}

 

以上の実験のコードを実行し、スレッドプールは、次のログを観察しています。

16:10:0番目のタスク19.281プール-1スレッド1固定遅延タイマーが訪問マルチスレッド
16:10:19.281第1プール1スレッド2マルチスレッド固定遅延タイマ訪問タスク
16:10:19.281プール-1 -thread-3 への訪問第2のタスクのマルチスレッドタイマ遅延に固定された
16:10:19.283プール-1 -thread-3 複数の固定遅延第3のタイマタスクは、訪問スレッド
10:19.283プール-1 16 -thread-2 訪問のマルチスレッド化固定遅延タイマー4つのタスク
16:10:22.283プール-1 -threadを訪問マルチスレッド-1第1の固定遅延タイマータスク
10:16:22.284プール-1 -thread-2 の3つのタスク訪問のマルチスレッドの固定遅延タイマー
16時10分:第2のタスク22.285プール1スレッド3固定遅延タイマーが訪問マルチスレッド
4タスク22.286プール-1スレッド3このマルチスレッドの固定遅延タイマー:16:10トリップ
16:10:訪問をマルチスレッド0番目のタスク22.287プール-1-スレッド-1固定遅延タイマー

 

ログが前に、ログから見てこの時間の後、各タスクが3秒未満ではない、この方法ではなく、固定金利よりも、一定の間隔で撮影したscheduleWithFixedDelayを発揮しません。



より多くのJavaテクノロジの記事「を参照してください章のJavaの開発ノート(オーダー)リスト

おすすめ

転載: www.cnblogs.com/pinlantu/p/10958829.html