1.个人理解:t1.join();
原线程插入即join一个线程t1,放弃原来的线程的执行,等待t1运行结束,再继续执行原线程。
其他博客说法:
join的意思是使得放弃当前线程的执行,并返回对应的线程,
程序在main线程中调用t1线程的join方法,则main线程放弃cpu控制权,并返回t1线程继续执行直到线程t1执行完毕
所以结果是t1线程执行完后,才到主线程执行,相当于在main线程中同步t1线程,t1执行完了,main线程才有执行的机会
thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。
2.t.join(1000); //等待 t 线程,等待时间是1000毫秒,下面再理解一下这个1000ms
不是指的a这个线程过1000毫秒就超时
是当前线程调用join开始计时,1000毫秒若a线程还没有结束,当前线程就继续往下执行
如果设置了一个超时时间,那就有两种情况下它会从阻塞中返回,一是对应的线程结束了,二是超时时间过完了
亲测超时不会报出任何异常。直接返回原近程。
下面是测试超时情况的代码:
import static java.lang.Thread.sleep;
public class test_timeout{
public static void main(String[] args){
Thread sleep_thr = new Thread(()->{ //使用lambda 匿名内部类,不太熟悉可以百度一下
System.out.println("sleep_thr started !");
try {
sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("sleep_thr completed !");
}, "sleep_thr");
new Thread(() ->{
sleep_thr.start();
System.out.println("main started");
System.out.println("go into sleep_thr");
try {
sleep_thr.join();
// sleep_thr.join(5); //测试修改为5ms输出文本的顺序
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("back to main");
System.out.println(Thread.currentThread() +" main completed");
}, "main").start();
}
}