Java停止线程的3种方法

目录
  • 1.自定义中断标识符
  • 2.interrupt中断线程
  • 3.stop停止线程
  • 总结

在 Java 中停止线程的实现方法有以下 3 种:

  • 自定义中断标识符,停止线程。
  • 使用线程中断方法 interrupt 停止线程。
  • 使用 stop 停止线程。

其中 stop 方法为 @Deprecated 修饰的过期方法,也就是不推荐使用的过期方法,因为 stop 方法会直接停止线程,这样就没有给线程足够的时间来处理停止前的保存工作,就会造成数据不完整的问题,因此不建议使用。而自定义中断标识也有一些问题,所以综合来看,interrupt 方法才是最理想的停止线程的方法,接下来我们一起来看它们的具体差异。

1.自定义中断标识符

自定义中断标识符就是在程序中定义一个变量来决定线程是否要中断执行,具体实现代码如下:

class FlagThread extends Thread {
    // 自定义中断标识符
    public volatile boolean isInterrupt = false;
	@Override
    public void run() {
        // 如果为 true -> 中断执行
        while (!isInterrupt) {
            // 业务逻辑处理
        }
    }
}

但自定义中断标识符的问题在于:线程中断的不够及时。因为线程在执行过程中,无法调用 while(!isInterrupt) 来判断线程是否为终止状态,它只能在下一轮运行时判断是否要终止当前线程,所以它中断线程不够及时,

比如以下代码:

class InterruptFlag {
    // 自定义的中断标识符
    private static volatile boolean isInterrupt = false;

    public static void main(String[] args) throws InterruptedException {
        // 创建可中断的线程实例
        Thread thread = new Thread(() -> {
            while (!isInterrupt) { // 如果 isInterrupt=true 则停止线程
                System.out.println("thread 执行步骤1:线程即将进入休眠状态");
                try {
                    // 休眠 1s
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("thread 执行步骤2:线程执行了任务");
            }
        });
        thread.start(); // 启动线程

        // 休眠 100ms,等待 thread 线程运行起来
        Thread.sleep(100);
        System.out.println("主线程:试图终止线程 thread");
        // 修改中断标识符,中断线程
        isInterrupt = true;
    }
}

以上代码的执行结果如下图所示: 

我们期望的是:线程执行了步骤 1 之后,收到中断线程的指令,然后就不要再执行步骤 2 了,但从上述执行结果可以看出,使用自定义中断标识符是没办法实现我们预期的结果的,这就是自定义中断标识符,响应不够及时的问题。

2.interrupt中断线程

使用interrupt方法可以给执行任务的线程,发送一个中断线程的指令,它并不直接中断线程,而是发送一个中断线程的信号,把是否正在中断线程的主动权交给代码编写者。相比于自定义中断标识符而然,它能更及时的接收到中断指令,

如下代码所示:

public static void main(String[] args) throws InterruptedException {
    // 创建可中断的线程实例
    Thread thread = new Thread(() -> {
        while (!Thread.currentThread().isInterrupted()) {
            System.out.println("thread 执行步骤1:线程即将进入休眠状态");
            try {
                // 休眠 1s
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                System.out.println("thread 线程接收到中断指令,执行中断操作");
                // 中断当前线程的任务执行
                break;
            }
            System.out.println("thread 执行步骤2:线程执行了任务");
        }
    });
    thread.start(); // 启动线程

    // 休眠 100ms,等待 thread 线程运行起来
    Thread.sleep(100);
    System.out.println("主线程:试图终止线程 thread");
    // 修改中断标识符,中断线程
    thread.interrupt();
}

以上代码的执行结果如下图所示: 

从上述结果可以看出,线程在接收到中断指令之后,立即中断了线程,相比于上一种自定义中断标识符的方法来说,它能更及时的响应中断线程指令。

3.stop停止线程

stop 方法虽然可以停止线程,但它已经是不建议使用的废弃方法了,这一点可以通过 Thread 类中的源码发现,stop 源码如下: 

从上面的图片可以看出,stop 方法是被 @Deprecated 修饰的不建议使用的过期方法,并且在注释的第一句话就说明了 stop 方法为非安全的方法。在最新版本 Java 中,此方法已经被直接移除了,所以强烈不建议使用。

总结

本文介绍了停止线程的 3 种方法:

  • 自定义中断标识符的停止方法,此方法的缺点是不能及时响应中断请求;
  • 使用 interrupt 中断线程方法,此方法是发送一个中断信号给线程,它可以及时响应中断,也是最推荐使用的方法;
  • 最后是 stop 方法,虽然它也可以停止线程,但此方法已经是过时的不建议使用的方法,在 Java 最新版本中已经被直接移除了,所以不建议使用。

到此这篇关于Java停止线程的3种方法的文章就介绍到这了,更多相关Java停止线程内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解Java停止线程的四种方法

    一.线程停止基础知识 interrupted(): 测试当前线程是否已经中断.该方法为静态方法,调用后会返回boolean值.不过调用之后会改变线程的状态,如果是中断状态调用的,调用之后会清除线程的中断状态. isInterrupted(): 测试线程是否已经中断.该方法由对象调用 interrupt(): 标记线程为中断状态,不过不会中断正在运行的线程. stop(): 暴力停止线程.已弃用. 二.停止线程方法1:异常法停止 线程调用interrupt()方法后,在线程的run方法中判断当前对

  • Java通过在主循环中判断Boolean来停止线程的方法示例

    本文实例讲述了Java通过在主循环中判断Boolean来停止线程的方法.分享给大家供大家参考,具体如下: package Threads; /** * Created by Frank */ public class StopBoolean extends Thread { // 确保变化对其它线程可见(主要是主线程要可见) protected volatile boolean done = false; public void run() { while (!done) { System.ou

  • java多线程之停止线程的方法实例代码详解

    和线程停止相关的三个方法 /* 中断线程.如果线程被wait(),join(),sleep()等方法阻塞,调用interrupt()会清除线程中断状态,并收到InterruptedException异常.另外interrupt();对于isAlive()返回false的线程不起作用. */ public void interrupt(); /* 静态方法,判断线程中断状态,并且会清除线程的中断状态.所以连续多次调用该方法,第二次之后必定返回false.另外,isAlive()用于判断线程是否处于

  • 面试题:Java中如何停止线程的方法

    如何停止线程是Java并发面试中的常见问题,本篇文章将从答题思路到答题细节给出一些参考. 答题思路: 停止线程的正确方式是使用中断 想停止线程需要停止方,被停止方,被停止方的子方法相互配合 扩展到常见的错误停止线程方法:已被废弃的stop/suspend,无法唤醒阻塞线程的volatile 1. 正确方式是中断 其实从逻辑上也很好理解的,一个线程正在运行,如何让他停止? A. 从外部直接调用该线程的stop方法,直接把线程停下来. B. 从外部通过中断通知线程停止,然后切换到被停止的线程,该线程

  • java通过共享变量结束run停止线程的方法示例

    stop()方法已经被弃用,原因是不太安全.API文档中给出了具体的详细解释.通过interrupted()方法打断线程.不推荐.通过共享变量结束run()方法,进而停止线程.如实例 复制代码 代码如下: public class ThreadInterrupt {    public static void main(String []args){        Runner run = new Runner();        run.start();        try {       

  • java安全停止线程的方法详解

    Thread.stop()是一个被废弃的方法,不被推荐使用的原因是stop方法太过于暴力,强行把执行到一半的线程终止,并且会立即释放这个线程所有的锁.会破坏了线程中引用对象的一致性. 使用判断标志位的方法中断线程 interrupt() //线程中断 (标志位设置为true) isInterrupted() //判断是否被中断 interrupted() //判断是否中断,并清除当前中断状态(标志位改为false) public static class TestThread extends T

  • Java停止线程的3种方法

    目录 1.自定义中断标识符 2.interrupt中断线程 3.stop停止线程 总结 在 Java 中停止线程的实现方法有以下 3 种: 自定义中断标识符,停止线程. 使用线程中断方法 interrupt 停止线程. 使用 stop 停止线程. 其中 stop 方法为 @Deprecated 修饰的过期方法,也就是不推荐使用的过期方法,因为 stop 方法会直接停止线程,这样就没有给线程足够的时间来处理停止前的保存工作,就会造成数据不完整的问题,因此不建议使用.而自定义中断标识也有一些问题,所

  • Java 创建线程的3种方法及各自的优点

    1. 继承 Thread 类,然后调用 start 方法. class MyThread extends Thread { //重写run方法,线程运行后,跑的就是run方法 public void run(){ //System.out.println(""); } public static void main(String[] args){ Thread t1 = new MyThread(); t1.start(); //线程运行,调用的 run()方法. } } 2. 实现

  • Java结束线程的三种方法及该如何选择

    java常用的结束一个运行中的线程的方法有3中:使用退出标志,使用interrupt方法,使用stop方法. 1.使用退出标志 即在线程内部定义一个bool变量来判断是否结束当前的线程: public class ThreadSafe extends Thread { public volatile boolean exit = false; public void run() { while (!exit){ //do work } } public static void main(Stri

  • 一文搞懂Java创建线程的五种方法

    目录 题目描述 解题思路 代码详解 第一种 继承Thread类创建线程 第二种:实现Runnable接口创建线程 第三种:实现Callable接口,通过FutureTask包装器来创建Thread线程 第四种:使用ExecutorService.Callable(或者Runnable).Future实现返回结果的线程 第五种:使用ComletetableFuture类创建异步线程,且是据有返回结果的线程 题目描述 Java创建线程的几种方式 Java使用Thread类代表线程,所有线程对象都必须

  • java创建线程的两种方法区别

    在Java中创建一个线程有两种方法:继承Thread类和实现Runnable接口. 下面通过两个例子来分析两者的区别: 1)继承Thread类 public class TestThread extends Thread { int count = 3; public TestThread(String ThreadName) { super(ThreadName); } @Override public void run() { for (int i = 0; i < 10; i++) if

  • JAVA实现线程的三种方法

    (1)继承Thread类,重写run函数创建:class xx extends Thread{  public void run(){Thread.sleep(1000) //线程休眠1000毫秒,sleep使线程进入Block状态,并释放资源}}开启线程:对象.start() //启动线程,run函数运行(2)实现Runnable接口,重写run函数开启线程:Thread t = new Thread(对象) //创建线程对象t.start()(3)实现Callable接口,重写call函数C

  • Java创建子线程的两种方法

    摘要: 其实两种方法归结起来看还是一种,都是利用Thread的构造器进行创建,区别就是一种是无参的,一种是有参的. 一.继承Thread线程类: 通过继承Thread类,重写run方法,子类对象就可以调用start方法启动线程,JVM就会调用此线程的run方法. 代码如下: public class MyThread extends Thread { public MyThread() { super(); } @Override public void run() { } // 线程执行结束

  • Java终止线程实例和stop()方法源码阅读

    了解线程 概念 线程 是程序中的执行线程.Java 虚拟机允许应用程序并发地运行多个执行线程. 线程特点 拥有状态,表示线程的状态,同一时刻中,JVM中的某个线程只有一种状态; ·NEW 尚未启动的线程(程序运行开始至今一次未启动的线程) ·RUNNABLE 可运行的线程,正在JVM中运行,但它可能在等待其他资源,如CPU. ·BLOCKED 阻塞的线程,等待某个锁允许它继续运行 ·WAITING 无限等待(再次运行依赖于让它进入该状态的线程执行某个特定操作) ·TIMED_WAITING 定时

  • Java 停止线程需要注意的地方

    Java中停止线程的原则是什么? 在 Java 中, 最好的停止线程的方式是使用中断 interrupt, 但是这仅仅是会通知到被终止的线程 "你该停止运行了", 被终止的线程自身拥有决定权 (决定是否.以及何时停止), 这依赖于请求停止方和被停止方都遵守一种约定好的编码规范. 任务和线程的启动很容易. 在大多数时候, 我们都会让它们运行直到结束, 或者让它们自行停止.然而, 有时候我们希望提前结束任务或线程, 或许是因为用户取消了操作,或者服务需要被快速关闭, 或者是运行超时或出错了

随机推荐