boy-learning-thread | 1.1.2 线程终止

不正确的线程终止 - stop() 方法

stop: 终止线程,并且清除监视器锁的信息,但是可能导致线程安全问题,JDK不建议使用

destroy:JDK未实现该方法

api 示例

public class Demo {
    public static void main(String [] args) {
        Thread thread = new Thread(() -> {
            System.out.print("hello world");
        });
        thread.stop();     
    }
}

正确的线程终止

1、正确的线程终止 - interrupt() 方法

如果目标线程在调用 Object class 的 wait()、wait(long) 或者 wait(long, int)方法、join()、join(long, int) 或 sleep(long, int) 方法时被阻塞,那么 interrupt 会生效,该线程的中断状态将被清除,抛出 InterruptedExecption 异常。

如果目标线程是被 I/O 或者 NIO 中的 Channel 阻塞,同样,I/O 操作会被中断或者返回特殊异常值。达到终止线程的目的。

如果以上条件都不满足,则会设置此线程的中断状态。

api 示例

public class Demo {
    public static void main(String [] args) {
        Thread thread = new Thread(() -> {
            System.out.print("hello world");
        });
        thread.interrupt();     
    }
}

2、正确的线程终止 - 标志位

代码逻辑中,增加一个判断,用来控制线程执行的终止。

为了避免线程可见性问题,一般用 volatile 修饰标志位成员变量,例如:

public class Demo extends Thread {
    
    public volatile static boolean flag = true;
    
    public static void main(String [] args) throws InterruptedException {
        new Thread(() -> {
            try{
                while(flag) {
                    System.out.println("running...");
                    Thread.sleep(1000L);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
        
        // 3秒后,将标志位修改为false,代表不在继续运行
        Thread.sleep(3000L);
        
        flag = false;
        
        System.out.println("stop running");
    }
}

推荐阅读更多精彩内容