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"); } } }