不正确的线程终止 - 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");
}
}
网友评论