JAvaにおける従来のスレッド通信の個人的見解


共通データを使用した経験があります.共通データ(同期ロックを含む)を使用するいくつかの方法は、同じクラスに配置します.プログラムの高集約を体現し、プログラムの堅牢性を強化します.
もう1つの経験は、スレッド内ではなく、同期コードやロックを共通のデータに置くことです.このようなメリットは何ですか.まず、オブジェクト向けの考え方に合っています.次に,この設計構造はスレッドの同期を容易に実現し,スレッドが共通データにアクセスするたびにスレッド内に同期コードを追加する必要がない.拡張とメンテナンスに役立ちます.
まず一例を見ると、サブスレッドはまず10回循環し、メインスレッドは100回循環し、次にサブスレッドは10回循環し、メインスレッドは100回循環し、このように50回循環する.
実装コードは次のとおりです.
public class TraditionalThreadConnection {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		final Service service = new Service();
		//   
		new Thread(new Runnable(){

			@Override
			public void run() {
				for(int i = 1;i<=50;i++){
					service.subThread(i);
				}
			}
			
		}).start(); 
		//   
		for(int i = 1;i<=50;i++){
			service.mainThread(i);
		}
	}
	
	
}
class Service{
	/*             */
	private boolean isSub = true;
	public synchronized void subThread(int loop){
		//             ,     
		while(!isSub){
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		for(int i=1;i<=10;i++){
			System.out.println("sub-thread-" + i + ",loop--" + loop);
		}
		isSub = false;
		//             
		this.notify();
	}
	public synchronized void mainThread(int loop){
		while(isSub){
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		for(int i=1;i<=100;i++){
			System.out.println("main-thread-" + i + ",loop--" + loop);
		}
		isSub = true;
		this.notify();
	}
}

もう一つ注意しなければならないのは、待つかどうかを判断する場所がなぜifではなくwhileに使われているのかということです.なぜなら、waitを使うときにnotifyを呼び出さないうちに自分で起こして、コードを実行し始める可能性があるからです.これを偽目覚ましと言います.whileを使用すると、偽の起動による災害を回避し、コードを実行できるかどうかを判断することができます.