1. 程式人生 > >java 執行緒 join(wait) 後,是如何喚醒

java 執行緒 join(wait) 後,是如何喚醒

Join 方法:本質上還是根據wait方法實現的。分析join原始碼發現join方法本身是使用了synchronized修飾符的。是加在方法上面的,意味著。 獲取了當前物件的鎖,然後繼續發現裡面的程式碼呼叫了wait。意味著我們先鎖,再釋放,等待喚醒,什麼情況下被喚醒呢:

仔細檢視join的原始碼,發現呼叫了wait(0),讓程式等待,那麼什麼時間鎖被釋放呢?。因為是以執行緒物件作為鎖的:

After run() finishes, notify() is called by the Thread subsystem.

當執行緒執行結束的時候,notify是被執行緒的子系統呼叫的

分別以普通物件和執行緒物件作為鎖,當使用執行緒物件作為所得時候,如果鎖物件執行完畢了。wait就會停止等待繼續執行

複製程式碼
public class ThreadTestl {
    public static void main(String[] args) {

        final MyLockThread o = new MyLockThread();

        //final Object oo = new Object();
        new Thread(new Runnable() {

            @Override
            public void run() {
                synchronized (o) {
                    System.err.println(
1); try { o.wait(0); } catch (InterruptedException e) { e.printStackTrace(); } System.err.println(2); } } }).start(); o.start(); }
static class MyLockThread extends Thread { public MyLockThread() { } @Override public void run() { System.err.println("MyLockThread"); } } }
複製程式碼