销毁线程
销毁线程,其实就是终止线程任务的执行,我们更希望这种终止操作是人为可控的,也就是主动退出,这样我们可以执行在退出时需要的一些列操作,保证程序的安全,否则可能会引发一些问题甚至是灾难
销毁线程的三种方式
- 1、通过判断标志位,主动退出
- 2、通过Thread类中成员方法interrupt(),主动退出
- 3、通过Thread类中成员方法stop(),强行退出
销毁线程的代码示例
public class ThreadDestroy {
public static void main(String[] args) {
//1、通过判断标志位,主动退出,推荐采用这种方式
//这种方式无法处理阻塞状态的线程,如处于sleep、wait或者join
ThreadOne t1 = new ThreadOne("通过判断标志位");
t1.start();
try {Thread.sleep(1000);}catch (Exception ignored){}
t1.flag = false;
//2、通过Thread类中成员方法interrupt(),主动退出
//正常情况通过判断标志位(interrupted()或者isInterrupted())来执行退出操作
//若遇见sleep、wait或者join阻塞状态,会抛出中断异常且清除中断状态
//此时不能通过判断标志位(interrupted()或者isInterrupted())来执行退出操作
//若需要判断,可以手动设置中断状态来执行退出操作
ThreadTwo t2 = new ThreadTwo("通过interrupt()");
t2.start();
try {Thread.sleep(1000);}catch (Exception ignored){}
t2.interrupt();
//3、通过Thread类中成员方法stop(),强行退出,无论是否阻塞
//这种方式极不推荐,慎用
ThreadThree t3 = new ThreadThree("通过stop()");
t3.start();
try {Thread.sleep(1000);}catch (Exception ignored){}
t3.stop();
}
static class ThreadOne extends Thread{
ThreadOne(String name){super(name);}
public boolean flag = true;
@Override
public void run() {
while(flag){
System.out.println(super.getName() + ":开始业务逻辑");
try {Thread.sleep(3000);}catch (Exception ignored){}
System.out.println(super.getName() + ":结束业务逻辑");
}
exit();
}
private void exit(){System.out.println(super.getName() + ":我主动退出了");}
}
static class ThreadTwo extends Thread{
ThreadTwo(String name){super(name);}
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()){
System.out.println(super.getName() + ":开始业务逻辑");
try {Thread.sleep(3000);}catch (Exception e){
Thread.currentThread().interrupt();
System.out.println(super.getName() + ":中断异常,手动设置中断状态");
}
System.out.println(super.getName() + ":结束业务逻辑");
}
exit();
}
private void exit(){System.out.println(super.getName() + ":我主动退出了");}
}
static class ThreadThree extends Thread{
ThreadThree(String name){super(name);}
@Override
public void run() {
try {
System.out.println(super.getName() + ":我强行退出了");
Thread.sleep(3000);
System.out.println("我不会显示");
}catch (Exception ignored){}
}
}
}