优雅的启动和关闭线程

本文探讨了Java中启动线程的正确方法,强调start而非run的区别,以及终止线程的优雅方式——使用interrupt。通过示例解释了为何不建议使用volatile和stop方法,同时解析了interrupt与isInterrupted方法的工作原理。
摘要由CSDN通过智能技术生成

1、启动线程:start和run的区别

启动线程时,要调用start方法。而start方法会去调用run方法,那么为什么不直接调用run方法?

public static void main(String[] args) {
   
        Runnable runnable = () -> {
   
            System.out.println(Thread.currentThread().getName());
        };
        runnable.run();
        new Thread(runnable).start();
    }

运行结果:main Thread-0
run方法只是一个普通的方法,执行时是由主线程去调用的,并没用使用子线程,start方法才是真正用子线程调用的。

start方法执行流程:

  • 1、检查线程状态,只有new状态下的线程才能继续,否则会抛出异常
  • 2、被加入线程组
  • 3、调用start0()方法启动线程

那么,一个线程调用两次start会发生什么?

IllegalThreadStateException
IllegalThreadStateException

在调用start方法时会进行状态检测,包括新建,就绪,阻塞,等待、计时等待、终止,第二次调用start() 方法的时候,已经被start的线程已经不再是(NEW)状态了,所以无论如何是不能再次启动的。

2、终止线程最优雅的方式——interrupt

在这里插入图片描述
网上基本上流传着三种终止线程的方式:常规方式:interrupt;有点逼格的方式:volatile;已经淘汰的方式:stop
其中,volatile方式最有迷惑性,在有些情况下会造成bug。

最优雅的方式:interrupt

interrupt方法并不是一种强制性终止线程的方式,它相当于是一个信号,interrupt方法触发之后,子线程是否停止,是子线程说的算。

public class RightWayStopThreadInProd implements Runnable{
   
    @Override
    public void run() {
   
        while (true){
   
            System.out.println("子线程执行任务");
            try {
   
                throwInMethod
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值