Java多线程技能(四)——停止线程(停止不了的线程)

目录

  • 1.停止线程的方法
  • 2.停止不了的线程

  停止多线程是在多线程开发时很重要的技术点,掌握此技术可以对线程的停止进行有效的处理。停止线程在java语言中并不像break语句那样干脆,需要些技巧性的处理。
  停止一个线程意味着在线程处理完任务之前停掉正在做的操作,也就是放弃当前的操作。停止一个线程可以使用Thread.stop()方法,但最好不用它。虽然它确实可以停止一个正在运行的线程,但是这个方法是不安全的(unsafe),而且是已被弃用作废的(deprecated),在将来的Java版本中,这个方法将不可用或不被支持。
  大多数停止一个线程的操作使用Thread.interrupt()方法,尽管方法的名称是“停止,中止”的意思,但这个方法不会终止一个正在运行的线程,还需要加入一个判断才可以完成线程的停止。

1.停止线程的方法

在Java中有以下3种方法可以终止正在进行的线程:

  1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
  2. 使用stop方法强行终止线程,但是不推荐使用这个方法,因为stop和suspend及resume一样,都是作废过期的方法,使用它们可能产生不可预料的结果。
  3. 使用interrupt方法中断线程。

2.停止不了的线程

  本例子将调用interrupt()方法来停止线程,但interrupt()方法的使用效果并不像for+break语句那样,马上就停止循环。调用interrupt()方法仅仅是在当前线程中打了一个停止的标记,并不是真的停止线程。
  先创建名称为Interrupt的项目,文件MyThread.java代码如下:

public class MyThread extends Thread {
    @Override
    public void run() {
        super.run();
        for (int i = 0; i < 50000; i++) {
            System.out.println("i = " + (i+1));
        }
    }
}

运行类Run.java代码如下:

public class Run {
    public static void main(String[] args){
        try {
            MyThread thread = new MyThread();
            thread.start();
            Thread.sleep(2000);
            thread.interrupt();
        } catch (InterruptedException e) {
            System.out.println("main catch");
            e.printStackTrace();
        }
    }
}

运行结果如图:
Java多线程技能(四)——停止线程(停止不了的线程)_第1张图片
                     在控制台输出50万行的日志


  从运行结果上看,调用interrupt线程并没有真的停止,而是让循环执行完了,这也就说明了interrupt方法不能真正的直接让线程停止,而是给线程打上了一个停止的标记。interrupt()方法只是设置线程的中断标记,当对处于阻塞状态的线程调用interrupt方法时(处于阻塞状态的线程是调用sleep, wait, join 的线程),会抛出InterruptException异常,而这个异常会清除中断标记。


以上代码下载请点击该链接:https://github.com/Yarrow052/Java-package.git

你可能感兴趣的:(java,开发语言)