Java中Thread类的join方法到底是如何实现等待
2017-11-25 22:56
483 查看
现在的场景是A线程执行:
public void run(){
bThread.join(0);//把b线程加入到当前线程(a线程),等待b结束,当前a线程才会结束.
}
B线程执行
public void run(){
for(int i=0;i<10000;i++)
lipMyAss();//亲我的屁股,哦~~亲
}
看join代码:
然后只说无限期等待的情况:
再来看sychronized是谁
成员方法加了synchronized说明是synchronized(this)......
this是谁啊?看吧 bThread.join(0); 那说明this就是b线程对象本身。
我擦了个擦,a线程要骂了,tm在我身体里等b线程。
大家都知道,有了wait,必然有notify,我刚保证楼主在整个jdk里面都不会找到对b线程对象的notify操作。这就要看jvm代码了:
至此,b线程对象被notifyall了,那么a线程也就能继续跑下去了。
至于wait/notify是怎么实现的,其实jvm实现的方法和java里面的ReentrantLock原理差不多,都是各种waitinglist,各种status判断,各种cas操作,有兴趣可以看ReentrantLock源码。
public void run(){
bThread.join(0);//把b线程加入到当前线程(a线程),等待b结束,当前a线程才会结束.
}
B线程执行
public void run(){
for(int i=0;i<10000;i++)
lipMyAss();//亲我的屁股,哦~~亲
}
看join代码:
public final synchronized void join(long millis) throws InterruptedException { long base = System.currentTimeMillis();//获取当前时间 long now = 0; if (millis < 0) {//判断不说了 throw new IllegalArgumentException("timeout value is negative"); } if (millis == 0) {//这个分支是无限期等待直到b线程结束 while (isAlive()) { wait(0); } } else {//这个分支是等待固定时间,如果b没结束,那么就不等待了。。。 while (isAlive()) { long delay = millis - now; if (delay <= 0) { break; } wait(delay); now = System.currentTimeMillis() - base; } } }
然后只说无限期等待的情况:
while (isAlive()) { //只要线程还活着,我tm就等到天荒地老 wait(0);//wati操作,那必然有synchronized与之对应 }
再来看sychronized是谁
public final synchronized void join(long millis)
成员方法加了synchronized说明是synchronized(this)......
this是谁啊?看吧 bThread.join(0); 那说明this就是b线程对象本身。
我擦了个擦,a线程要骂了,tm在我身体里等b线程。
大家都知道,有了wait,必然有notify,我刚保证楼主在整个jdk里面都不会找到对b线程对象的notify操作。这就要看jvm代码了:
//一个c++函数: void JavaThread::exit(bool destroy_vm, ExitType exit_type) ; //这家伙是啥,就是一个线程执行完毕之后,jvm会做的事,做清理啊收尾工作, //里面有一个贼不起眼的一行代码,眼神不好还看不到的呢,就是这个: ensure_join(this); //翻译成中文叫 确保_join(这个);代码如下: static void ensure_join(JavaThread* thread) { Handle threadObj(thread, thread->threadObj()); ObjectLocker lock(threadObj, thread); thread->clear_pending_exception(); java_lang_Thread::set_thread_status(threadObj(), java_lang_Thread::TERMINATED); java_lang_Thread::set_thread(threadObj(), NULL); //同志们看到了没,别的不用看,就看这一句,妈了个淡淡, //thread就是当前线程,是啥是啥?就是刚才说的b线程啊。 lock.notify_all(thread); thread->clear_pending_exception(); }
至此,b线程对象被notifyall了,那么a线程也就能继续跑下去了。
至于wait/notify是怎么实现的,其实jvm实现的方法和java里面的ReentrantLock原理差不多,都是各种waitinglist,各种status判断,各种cas操作,有兴趣可以看ReentrantLock源码。
相关文章推荐
- Thread.join()--Java实现主线程等待子线程
- Thread.join()方法实现main()方法等待所有子线程执行完成[base jdk8]
- JAVA实现多线程的两种方法,及如何使用
- 如何在Android源码里查找Java中native方法对应的C++实现
- Java里如何实现一个方法在不同情况下“返回”不同的类型变量?
- java中如何实现重复执行一个方法(事)
- 如何在Java中实现远程方法调用
- 【转载】JAVA中线程的两种实现方法-实现Runnable接口和继承Thread类
- JAVA中创建线程对象的两种方法:继承Thread和实现Runable
- java创建多线程的两种方法(继承Thread类/实现Runnable接口)
- java string 转date方法如何实现
- Java Thread类如何在子类中实现run
- Thread 提供的让一个线程等待另一个线程完成的方法:join()方法
- 利用Thread类的join方法实现线程同步
- java中,父类是抽象类不能通过工厂输出时,如何通过其他类实现输出的示例代码(工厂方法种类(1))
- Java HashMap到底是如何实现的,结合源代码分析
- 如何在Java中实现远程方法调用
- C#中如何实现JAVA中的String.replaceAll()方法功能
- Java中用Thread.join实现单任务分成多个任务最后合并结果集
- Java Thread Join方法