Thread.join中使用Object.wait實現:
//java.lang.Thread
public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (millis == 0) {
while (isAlive()) {
wait(0);
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
wait方法,jdk文檔中的解釋時:Causes the current thread to wait ,wait方法會讓當前線程從runnable變成waitting的狀態。怎么理解這句話呢?首先每個對象都可以作為一個鎖,wait方法是根類Object的方法,每個對象都有其wait方法,在main方法中執行如下代碼:
public class Program{
public static void main(String[] args) throws Exception{
MyThread myThread = new Thread(new Runnable(){
@Override
public void run() {
//this就是當前對象myThread,同步獲取到myThread鎖
synchronized (this) {
this.notify();//喚醒在myThread鎖上等待的單個線程。即main主線程從waitting變成runnable,main方法繼續執行
}
}
});
myThread.setName("myThread");
myThread.start();
//同步獲取到myThread鎖
synchronized (myThread) {
//使當前線程(main)從runnable進入waitting狀態,等待其他某個線程調用myThread鎖的 notify方法
myThread.wait();
}
}
myThread對象就是一個鎖,main方法synchronized (myThread)獲取到鎖,並執行該鎖的wait方法,使main線程一直等待,當線程MyThread中獲取同一個鎖,並執行該鎖的notify方法,使之前因該鎖等待main方法可以繼續執行。
