Join 方法:本質上仍是根據wait方法實現的。分析join源碼發現join方法自己是使用了synchronized修飾符的。是加在方法上面的,意味着。獲取了當前對象的鎖,而後繼續發現裏面的代碼調用了wait。意味着咱們先鎖,再釋放,等待喚醒,什麼狀況下被喚醒呢:java
仔細查看join的源碼,發現調用了wait(0),讓程序等待,那麼什麼時間鎖被釋放呢?。由於是以線程對象做爲鎖的:ide
After run() finishes, notify() is called by the Thread subsystem.線程
當線程運行結束的時候,notify是被線程的子系統調用的code
分別以普通對象和線程對象做爲鎖,當使用線程對象做爲所得時候,若是鎖對象執行完畢了。wait就會中止等待繼續執行對象
package com.famous.thread; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ThreadPool { 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"); } } }