マルチスレッドwait()notifyの使い方
2657 ワード
mainクラス
クラスとして集中的に呼び出します
2つのスレッドがqueryのgetとsetをそれぞれ呼び出す方法を書きます.
thread1
thread2
====================================================
プログラムを分析します.
これは2つのスレッドの間で相手を待ち、呼び覚まし、相手を扱うものです.
しかし、重要なポイントはsynchronizedをメソッドの前に追加することです.追加しないと
exceptionが表示されます.実は私はまだこれがどういう意味なのか分からない.調べてみると、普段私たちが勉強している間にスレッドを使っていません.特にjava webの勉強では、下位のフレームワークはすでにあなたにこれらを書いてあげました.私たちはビジネスロジックを書くだけでいいです.
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の勉強では、下位のフレームワークはすでにあなたにこれらを書いてあげました.私たちはビジネスロジックを書くだけでいいです.