Thread类的join方法

本文详细剖析了Java中线程的join方法,解释了其内部机制,特别是无限期等待的情况。通过分析源码,展示了线程如何通过wait和notify机制协同工作,确保线程间的正确同步。内容涉及线程状态转换、等待队列以及ReentrantLock的相关概念。
摘要由CSDN通过智能技术生成

现在的场景是A线程执行:

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源码

有帮到你的点赞、收藏一下吧

                                                                     需要更多教程,微信扫码即可

                                                                                 

                                                                                         👆👆👆

                                                        别忘了扫码领资料哦【高清Java学习路线图】

                                                                     和【全套学习视频及配套资料】
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值