【多线程-从零开始-叁】线程的核心操作

2024-09-21 19:35:31 浏览数 (1)

  • 此时两个 join 都是写在 main 里面的,所以都是 main 线程等待 t1t2t1t2 之间没有等待关系
  • 若在 t2 中写 t1.join,则 t2 需要等待 t1 线程先执行完

  • 上述 join 都是无参的,意思是“死等”,“不见不散”,被等待的线程,只要不执行完,就会持续阻塞
  • 上述死等操作,其实不是一个好的选择,因为一旦被等待的线程代码出现了一些 bug 了,就可能使这个线程迟迟无法结束,从而使等待线程一直阻塞而无法进行其他操作
  • 所以在实际开发中,都会设置一个“超时时间”,最多等多久,就是 join 的参数image.pngimage.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 占用

0 人点赞