java中join的原理

我们都知道程序中多线程,不同线程之间的运行顺序是我们要考虑的问题。我们可以使用一种join()方法,来对线程执行的顺序进行定义。当某一线程执行完,再运行下一个线程。下面我们就join()概念和源码进行分析和理解,然后带来join()使用方法的实例介绍,一起来看具体内容。

1.join()概念

一直等待直到该线程死亡,可以指定等待指定时间内线程死亡,否则,一直在循环判断线程。如果join的方法在线程实例中被调用,当前运行的线程会被堵塞,直到线程实例运行完成。

2.join()源码

publicfinalsynchronizedvoidjoin(longmillis)
throwsInterruptedException{
longbase=System.currentTimeMillis();
longnow=0;

if(millis<0){
thrownewIllegalArgumentException("timeoutvalueisnegative");
}

if(millis==0){
while(isAlive()){
wait(0);
}
}else{
while(isAlive()){
longdelay=millis-now;
if(delay<=0){
break;
}
wait(delay);
now=System.currentTimeMillis()-base;
}
}
}

可以看出它是利用wait方法来实现的,上面的例子当main方法主线程调用线程t的时候,main方法获取到了t的对象锁,而t调用自身wait方法进行阻塞,只要当t结束或者到时间后才会退出,接着唤醒主线程继续执行。millis为主线程等待t线程最长执行多久,0为永久直到t线程执行结束。

3.join()实例

//join抢占CPU时间片
publicstaticvoidjoinTest()throwsInterruptedException{
//定义一个线程
Threadthread=newThread(()->{
System.out.println(Thread.currentThread().getName()+":测试线程开始执行。。。");
try{
Thread.sleep(5000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+":测试线程执行结束了。");
});
thread.start();
System.out.println(thread.getName()+":执行join方法");
thread.join();
System.out.println(Thread.currentThread().getName()+":主线程开始执行");
}

打印日志:

Thread-0:执行join方法
Thread-0:测试线程开始执行。。。
Thread-0:测试线程执行结束了。
main:主线程开始执行

原文来自:https://www.py.cn

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容