- 此时两个
join都是写在main里面的,所以都是main线程等待t1和t2,t1和t2之间没有等待关系 - 若在
t2中写t1.join,则t2需要等待t1线程先执行完
- 上述 join 都是无参的,意思是“死等”,“不见不散”,被等待的线程,只要不执行完,就会持续阻塞
- 上述死等操作,其实不是一个好的选择,因为一旦被等待的线程代码出现了一些 bug 了,就可能使这个线程迟迟无法结束,从而使等待线程一直阻塞而无法进行其他操作
- 所以在实际开发中,都会设置一个“超时时间”,最多等多久,就是 join 的参数
image.png相关, 像 Windows, Linux 系统,线程调度开销比较大;计算机中还有一类系统——“实时操作系统”,就能把调度开销尽可能降低,开销小于一定的误差要求,从而可以做到更精确。一般用于航空航天,军事...... 不过实时操作系统是舍弃了很多功能换来的实时性
四、获取当前线程引用
想在某个线程中,获取到自身的 Thread 对象的引用,就可以通过 currentThread 来获取到
代码语言:java复制public class Demo7 {
public static void main(String[] args) throws InterruptedException {
Thread mainThread = Thread.currentThread();
Thread t = new Thread(()->{
//需要在 t 中调用主线程.join
System.out.println("t 线程开始等待");
try {
mainThread.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("t 线程结束");
});
t.start();
Thread.sleep(1000);
System.out.println("main 线程结束");
}
}
//打印顺序:
//t 线程开始等待
//main 线程结束
//t 线程结束任何线程中,都可以通过这样的操作,拿到线程的引用
任何需要的时候,都可以通过这个方法来获取到
五、休眠当前线程
Thread.sleep可以让调用的线程阻塞等待,是有一定时间的- 线程执行
sleep,就会使这个线程不参与CPU调度,从而把CPU资源让出来给别人使用 - 也把
sleep这种操作,称为“放权”,放弃使用CPU的权利 - 有的开发场景中,发现某个线程的
CPU占用率过高,就可以通过sleep来进行放权改善 - 虽然
CPU就是给程序用的,但是有的程序可能包含很多线程,这些线程之间是有“轻重缓急”的 - 虽然线程的优先级就可以产生影响,但是优先级的影响是比较有限的,也可以通过
sleep来更明显的影响到这里的CPU占用


