16-停止线程

停止一个线程意味着在线程处理完任务之前停掉正在做的操作,也就是放弃当前的操作。在 Java 中有3种方法可以终止正在运行的线程:

  • 当 run() 方法完成后线程终止。
  • 使用 Thread.stop() 方法(不i推荐),但是 stop()suspend()resume() 一样,都是作废的方法,不安全的而且已经被官方放弃使用。
  • 使用 Thread.interrupt() 方法。(推荐)

# 使用 interrupt() 方法来停止线程
调用 interrupt() 方法仅仅是在当前线程中打了一个停止的标记,并不是真正停止线程。Thread.java 类中提供了两个方法来判断一个线程的状态是否处于停止状态:

  • public static boolean interrupted():注意这是一个静态方法,测试 当前线程 是否已经中断,并且执行该方法后具有将状态标志重置为 false 的功能。
  • public boolean isInterrupted():注意这是一个实例方法。测试线程对象 myThread 是否已经处于中断状态,但不清除中断标志。

“抛异常法” 实现线程的停止(推荐)

1
2
3
4
5
6
7
8
9
10
11
public class MyThread extends Thread{
@Override
public void run(){
try{
for (int i=0;i<10000;i++){
if(this.interrrupted()){
System.out.println("已经是停止状态了!我要退出了!");
throw new InterruptedException(); //因为这里抛出了异常,所以for循环后面的语句都不执行,导致线程终止了
}
System.out.println("i="+(++i));
}

在沉睡中停止线程

如果线程在 sleep() 状态下停止线程,会是什么效果?答案是会引发 InterruptedException,进入 catch 语句,并且清除停止状态标记,重新复位为 false。如果是相反的操作,先停止后遇到 sleep(),也会引发同样的异常。

使用 return 停止线程(不推荐)

将方法 interrupt() 与 return 结合使用也能实现停止线程的效果。