マルチスレッドwait()notifyの使い方

2657 ワード

mainクラス
 
package endual;

public class MainApp {

	public static void main(String[] args) {
		Query q = new Query(0) ;
		
		Thread thread = new Thread(new Thread1(q)) ;
		Thread thread2 = new Thread(new Thread2(q)) ;
		
		thread.start() ;
		thread2.start() ;
	}
	
}

 
 
 
クラスとして集中的に呼び出します
 
 
package endual;

public class Query {

	private int value = 7;
	private boolean isFlag = false ;
	public Query(int value) {
		
		//this.value = value ;
	}
	
	public synchronized  void getValue() {
		
		if (!isFlag) { // 
			
			isFlag = true ;
			notify() ;
		}
		
		try {
			wait() ;
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		System.out.println(" 1" + (value++)) ;
		
		
	}
	
	public synchronized void setValue() {
		
		if (!isFlag) { // 
			
			try {
				wait() ;
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
		}
		
		isFlag = false ;
		value-- ;
		System.out.println(" 2" + value) ;
		notify() ;
	}
	

}

 
 
2つのスレッドがqueryのgetとsetをそれぞれ呼び出す方法を書きます.
 
thread1
package endual;

public class Thread1 implements Runnable{

	private Query q = null ;
	
	public Thread1(Query q) {
		this.q = q ;
	}
	
	public void run() {

		while (true) {
			
			q.getValue() ;
			
		}
		
	}

}

 
 
 
thread2
 
 
package endual;

public class Thread2 implements Runnable{

	private Query q = null ;
	
	public Thread2(Query q) {
		this.q = q ;
	}
	
	public void run() {

		while (true) {
			
		q.setValue() ;
			
		}
		
	}
}

 
====================================================
 
プログラムを分析します.
これは2つのスレッドの間で相手を待ち、呼び覚まし、相手を扱うものです.
しかし、重要なポイントはsynchronizedをメソッドの前に追加することです.追加しないと
exceptionが表示されます.実は私はまだこれがどういう意味なのか分からない.調べてみると、普段私たちが勉強している間にスレッドを使っていません.特にjava webの勉強では、下位のフレームワークはすでにあなたにこれらを書いてあげました.私たちはビジネスロジックを書くだけでいいです.