- 此时两个
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
占用