等待喚醒案例、wait方法和notifyAll方法
阿新 • • 發佈:2020-12-25
等待喚醒案例程式碼實現
package Text2;
public class demo6WaitAndNotify {
public static void main(String[] args) {
//建立鎖物件,保證唯一
Object obj=new Object();
//建立一個顧客執行緒
new Thread(){
@Override
public void run() {
//保證等待和喚醒的執行緒只能有一個執行,需要使用同步技術
synchronized (obj) {
System.out.println("告訴老闆要的包子的種類和個數");
//呼叫wait方法,放棄cpu的執行,進入waiting狀態
try {
obj.wait(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//喚醒之後執行的程式碼
System.out.println("包子做好了,開吃!");
}
}
}.start();
//建立一個老闆執行緒
new Thread(){
@Override
public void run() {
//花5秒做包子
try {
Thread. sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//保證等待和喚醒的執行緒只能有一個執行,需要使用同步技術
synchronized (obj){
System.out.println("做好後,告知顧客包子做好了");
//包子做好後,呼叫notify方法,喚醒顧客吃包子
obj.notify();
}
}
}.start();
}
}
Object類中wait帶引數方法和notifyAll方法
package Text2;
public class demo6WaitAndNotify {
public static void main(String[] args) {
//建立鎖物件,保證唯一
Object obj=new Object();
//建立一個顧客執行緒
new Thread(){
@Override
public void run() {
//保證等待和喚醒的執行緒只能有一個執行,需要使用同步技術
synchronized (obj) {
System.out.println("告訴老闆要的包子的種類和個數");
//呼叫wait方法,放棄cpu的執行,進入waiting狀態
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
//喚醒之後執行的程式碼
System.out.println("包子做好了,顧客1開吃!");
}
}
}.start();
new Thread(){
@Override
public void run() {
//保證等待和喚醒的執行緒只能有一個執行,需要使用同步技術
synchronized (obj) {
System.out.println("告訴老闆要的包子的種類和個數");
//呼叫wait方法,放棄cpu的執行,進入waiting狀態
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
//喚醒之後執行的程式碼
System.out.println("包子做好了,顧客2開吃!");
}
}
}.start();
//建立一個老闆執行緒
new Thread(){
@Override
public void run() {
//花5秒做包子
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//保證等待和喚醒的執行緒只能有一個執行,需要使用同步技術
synchronized (obj){
System.out.println("做好後,告知顧客包子做好了");
//包子做好後,呼叫notify方法,喚醒顧客吃包子
obj.notifyAll();
}
}
}.start();
}
}
notifyAll()喚醒在此物件監視器上等待的所有執行緒
notify()喚醒在此物件監視器上等待的單個執行緒