JAva wait()notyfy()の使用

4072 ワード

同時プログラミングは企業で多く使われており、同時学習にとって重要であることが知られています.
プログラムから分析したいのですが、私がこのプログラムを書いたとき、wait()がスレッド待ちであることしか知りませんでした.
notifyは起動スレッドであり、もう一つのnotifyAllはすべてのスレッドを起動します.一般的には、保険のためにnotifyAllでスレッドを起動します.
 
 
しかし、あなたは本当にこの意味を理解していますか?次はプログラムを見てみましょう.
 
 
mainクラス
package endual;

public class MainApp {

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

 
 
Query 1クラス
package endual;

public class Query1 {

	private int value = 7;
	private boolean isFlag = false ;
	public Query1(int value) {
		
		//this.value = value ;
	}
	
	public synchronized  void getValue() {
		
		try {
			wait() ; //      ,      ,          
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("-------------------------------------------") ;
		
	}
	
	
	

}

 
queryクラス
 
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 ;
			notifyAll() ;
		}
		
		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) ;
		notifyAll() ;
	}
	

}

 
明らかに、上記の方法はnotifyAllという意味で、待機しているすべてのスレッドを呼び覚ますことです.
 
 
3つのスレッド:
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() ;
   
  }
  
 }

}










--------------------------------------------



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() ;
   
  }
  
 }
}




-------------------------------------



package endual;

public class Thread3 implements Runnable{

 private Query1 q1 = null ;
 
 public Thread3(Query1 q1) {
  this.q1 = q1 ;
 }
 
 public void run() {

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

}



















 
 
 
お伺いしますが、印刷の結果に---------------------------------------------------------------------------------------------------------------------------------------------------
これですか.