您的位置:首页 > 编程语言 > Java开发

java 线程 join(wait) 后,是如何唤醒

2017-09-13 19:54 651 查看
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");
}

}
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐