JAva wait()notyfy()の使用
4072 ワード
同時プログラミングは企業で多く使われており、同時学習にとって重要であることが知られています.
プログラムから分析したいのですが、私がこのプログラムを書いたとき、wait()がスレッド待ちであることしか知りませんでした.
notifyは起動スレッドであり、もう一つのnotifyAllはすべてのスレッドを起動します.一般的には、保険のためにnotifyAllでスレッドを起動します.
しかし、あなたは本当にこの意味を理解していますか?次はプログラムを見てみましょう.
mainクラス
Query 1クラス
queryクラス
明らかに、上記の方法はnotifyAllという意味で、待機しているすべてのスレッドを呼び覚ますことです.
3つのスレッド:
お伺いしますが、印刷の結果に---------------------------------------------------------------------------------------------------------------------------------------------------
これですか.
プログラムから分析したいのですが、私がこのプログラムを書いたとき、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() ;
}
}
}
お伺いしますが、印刷の結果に---------------------------------------------------------------------------------------------------------------------------------------------------
これですか.