public static void main(String[] args) {
...
Thread t1 = new Thread(runnable);
t1.start();
t1.join();
...
}
二、源码解读:public final synchronized void join(long millis)
throws InterruptedException {
...
if (millis == 0) {
while (isAlive()) {
wait(0);
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
可以看到join是同步方法,锁对象是当前对象即t1。所以这里是当前线程(main线程,因为是main中调用的join方法)持有了t1对象。isAlive()是本地方法,非同步。然后判断的是t1线程是否活跃。当t1线程活跃时,调用wait(0)方法,这是Object类的方法,Object是超类,所以这里是使持有t1对象的线程阻塞,即main线程阻塞。
可以看成如下代码:
public final void join(long millis){
synchronized(t1) {
while (t1.isAlive()) {
t1.wait(0);
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)