執行緒通訊的例題
阿新 • • 發佈:2021-01-24
技術標籤:多執行緒
package com.yang.java;
/**
*wait():一旦執行此方法,當前執行緒就會進入阻塞狀態,並釋放同步監視器
notify():一旦執行此方法,就會喚醒被wait()的一個執行緒,如果有多個執行緒被wait,就喚醒優先順序高的
notifyALL():一旦執行此方法就會喚醒被wait的執行緒
**/
import java.util.concurrent.locks.ReentrantLock;
public class ArrayTest {
public static void main(String[] args) {
Window3 td= new Window3();
Thread t1 = new Thread(td);
Thread t2 = new Thread(td);
t1.setName("視窗1");
t2.setName("視窗2");
t1.start();
t2.start();
}
}
/**
sysnchronized都可以解決執行緒安全問題
不同點:sysnchronized機制在執行完相應的同步程式碼以後
自動釋放監視器
lock 需要手動的啟動同步(lock()),同時結束也需要手動實現UnLock()
*/
class Window3 implements Runnable {
private int number=1;
private ReentrantLock lock=new ReentrantLock();
@Override
public void run() {
while (true) {
// try {
// lock.lock();
//
// } finally {
// lock.unlock();
// }
synchronized(this ) {
//喚醒
notify();
if (number <=100) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":賣票,票號為:" + number);
number++;
try {
// sleep不會釋放鎖
// 使用呼叫wait方法讓其阻塞,喚醒執行緒
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else {
break;
}
}
}
}
/**
private synchronized void show(){//同步監視器:this
//synchronized (this){
//}
}**/
}
wait()和sleep()方法的區別
相同點:一旦執行方法,都可以使得當前執行緒進入阻塞狀態
不同點:兩個方法宣告位置不同,Thread類中宣告Sleep(),Object宣告在wait中
呼叫範圍不同:sleep可以在任何需要的場景下呼叫,wait必須在同步程式碼塊中
關於是否釋放同步監聽器:如果兩個方法都使用在同步程式碼塊或同步方法中,sleep不會釋放鎖,wait會釋放鎖