Javaプログラミングのマルチスレッド問題の実例コード


前のいくつかのブログは基本的にjava併発の内容をまとめました。このブログは主に一つの問題から始まります。前にまとめたどのような同時技術を使って解決できますか?
テーマの説明:
シミュレーションシーン:16件のログを処理して、ログごとに印刷時間を記録すると1秒が必要です。正常な場合、この16本のレコードを打ち上げると16秒が必要です。今は効率を上げるために、4つのスレッドを開いて印刷します。4秒でプリントアウトします。このデモを実現します。
まずこのテーマを分析してみます。この16のログ記録については、メインスレッドの中で生成できます。これは何の難度もないです。鍵は4つのスレッドを開いて実行します。現在は2つの考えがあります。一つはログの生成とログの印刷スレッドが論理的に切り離されます。一つはログの生成とログを印刷するスレッドが論理的に分離されていません。このように言いますと、ちょっと分かりにくいかもしれません。この二つの考えに対して、実現したデモを書いてください。
考えが同じである
ログ生成とログ印刷は論理的に分離されています。
これは二つの戦線に相当します。一つの戦線が絶え間なく日誌を生み出し、もう一つの戦線が絶え間なく日誌を印刷しています。明らかに渋滞待ち行列の使用を思い付きます。ログが発生して、待ち行列の中に割り込みます。プリントログが止まらないのは、待ち行列の中から取ります。列のサイズは自分で設定できます。16個を設定してもいいし、1つに設定してもいいです。これは実行に影響しません。だからBlockingQueを使います。実現したdemoを見てみます。

public class Practice1 {
	public static void main(String[] args) {
		//        ,       16   
		BlockingQueue<String> queue = new ArrayBlockingQueue<String>(16);
		for (int i = 0; i < 4; i ++) {
			//                 
			new Thread(new Runnable() {
				@Override
				        public void run() {
					while(true) {
						try {
							String log = queue.take();
							//   
							parseLog(log);
							//    
						}
						catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
				}
			}
			).start();
		}
		System.out.println("begin:" + (System.currentTimeMillis()/1000));
		for (int i = 0; i < 16; i ++) {
			final String log = "" + (i+1);
			//      
			try {
				queue.put(log);
				//              
			}
			catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	public static void parseLog(String log) {
		//       
		System.out.println(Thread.currentThread().getName() + "---"
		        + log + "---" + (System.currentTimeMillis()/1000));
		try {
			Thread.sleep(1000);
			//          1 
		}
		catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
これはシステムが動いているように、ログを作成しながら、複数のスレッドを開いてログ情報を印刷しています。
考え方2
ログの生成とログの印刷は論理的に分離されていません。
この考えは、私が日誌を作ると同時に、印刷してくれます。四つのスレッドを一緒にやります。この考え方はスレッド池を使わなければなりません。最初にスレッド池を作って、中に4つのスレッドを入れて、ログを作成する時、このスレッド池にスレッドを持って行って実行させます。デモは以下の通りです

public class Practice1 {
	public static void main(String[] args) {
		ExecutorService service = Executors.newFixedThreadPool(4);
		//       
		System.out.println("begin:" + (System.currentTimeMillis()/1000));
		for (int i = 0; i < 16; i ++) {
			final String log = "" + (i+1);
			//      
			service.execute(new Runnable() {
				//        
				@Override
				        public void run() {
					parseLog(log);
				}
			}
			);
		}
		service.shutdown();
		//          
	}
	public static void parseLog(String log) {
		System.out.println(Thread.currentThread().getName() + "---"
		        + log + "---" + (System.currentTimeMillis()/1000));
		try {
			Thread.sleep(1000);
			//          1 
		}
		catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
この問題については、ここまでにまとめましょう。この二つの考えをはっきりさせると、普通効果的に解決できます。
締め括りをつける
以上がJavaプログラミングのマルチスレッド問題のインスタンスコードのすべての内容です。興味のある方は引き続き当駅の他のテーマを参照してください。友達のサポートに感謝します。