广告
返回顶部
首页 > 资讯 > 后端开发 > Python >详解Java停止线程的四种方法
  • 113
分享到

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

2024-04-02 19:04:59 113人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

一、线程停止基础知识 interrupted(): 测试当前线程是否已经中断。该方法为静态方法,调用后会返回boolean值。不过调用之后会改变线程的状态,如果是中断状态

一、线程停止基础知识

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

二、停止线程方法1:异常法停止

   线程调用interrupt()方法后,在线程的run方法中判断当前对象的interrupted()状态,如果是中断状态则抛出异常,达到中断线程的效果。

   如下示例:

MyThread.java


public class MyThread extends Thread {

    @Override
    public void run() {
        try {
            for (int i = 0; i < 500000; i++) {
                if (MyThread.interrupted()){
                    System.out.println("已经是停止状态了,我要退出了!");
                    throw new InterruptedException();
                }
                System.out.println("i = " + (i+1));
            }

            System.out.println("如果我被输出了,则代表线程没有停止");
        } catch (InterruptedException e) {
            System.out.println("在MyThread类中的run方法中被捕获");
            e.printStackTrace();
        }
    }
}

Main.java



public class Main {

    public static void main(String[] args) {
        try {
            MyThread myThread  = new MyThread();
            myThread.start();
            Thread.sleep(100);
            myThread.interrupt();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("end!");
    }
}

结果如下:
i = 19115
i = 19116
i = 19117
i = 19118
i = 19119
end!

已经是停止状态了,我要退出了!
在MyThread类中的run方法中被捕获
java.lang.InterruptedException
 at com.book.interrupt_exit.MyThread.run(MyThread.java:15)

Process finished with exit code 0

三、停止线程方法2:在沉睡中停止

先将线程sleep,然后调用interrupt标记中断状态,interrupt会将阻塞状态的线程中断。会抛出中断异常,达到停止线程的效果。如下示例:

MyThread.java


public class MyThread extends Thread {

    @Override
    public void run() {
        try {
            System.out.println("run-----------start");
            Thread.sleep(5000);
            System.out.println("run-----------end");
        } catch (InterruptedException e) {
            System.out.println("在沉睡中被停止!进入catch,线程的是否处于停止状态:" + this.isInterrupted());
            e.printStackTrace();
        }

    }
}

Main.java


public class Main {

    public static void main(String[] args) {
        try {
            MyThread myThread = new MyThread();
            myThread.start();
            Thread.sleep(2000);
            System.out.println("状态:"+MyThread.interrupted());
            myThread.interrupt();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

结果
run-----------start
状态:false
java.lang.InterruptedException: sleep interrupted
在沉睡中被停止!进入catch,线程的是否处于停止状态:false
 at java.lang.Thread.sleep(Native Method)
 at com.book.sleep_interrupt.MyThread.run(MyThread.java:13)

线程先调用interrupt标记中断状态,然后线程再睡眠。会抛出中断异常,达到停止线程的效果。如下:

MyThread1.java


public class MyThread1 extends Thread {

    @Override
    public void run() {
        try {

            for (int i = 0; i < 100000; i++) {
                System.out.println("i = " + (i+1));
            }
            System.out.println("run begin");
            //interrupt是做一个中断标记,当时不会去中断正在运行的线程,当该线程处于阻塞状态时就会进行中断
            //因此,先进行interrupt后,再遇到sleep阻塞时,才会进行中断
            Thread.sleep(200000);
            System.out.println("run end");

        } catch (InterruptedException e) {
            System.out.println("先停止,再遇到了sleep! 进入catch!");
            e.printStackTrace();
        }
    }
}

Main1.java


public class Main1 {

    public static void main(String[] args) {

        MyThread1 myThread1 = new MyThread1();
        myThread1.start();
        myThread1.interrupt();
        System.out.println("end!");
    }
}

结果:
i = 99993
i = 99994
i = 99995
i = 99996
i = 99997
i = 99998
i = 99999
i = 100000
run begin

先停止,再遇到了sleep! 进入catch!
java.lang.InterruptedException: sleep interrupted
 at java.lang.Thread.sleep(Native Method)
 at com.book.sleep_interrupt.MyThread1.run(MyThread1.java:19)

四、停止线程方法3:stop()暴力停止

线程调用stop()方法会被暴力停止,方法已弃用。该方法会有不好的后果:

  1. 强制让线程停止有可能使一些请理性的工作得不到完成。
  2. 定的对象进行了“解锁”,导致数据得不到同步的处理,出现数据不一致的问题(比如一个方法加上了synchronized,并在其中进行了一个长时间的处理,而在处理结束之前该线程进行了stop(),则未完成的数据将没有进行到同步的处理)

五、停止线程方法4:使用return停止线程

调用interrupt标记为中断状态后,在run方法中判断当前线程状态,如果为中断状态则return,能达到停止线程的效果。

备注:建议使用“抛异常”的方法来实现线程的停止,因为在catch块中还可以将异常向上抛,使线程停止的事件得以传播

参考:《Java多线程编程核心技术》

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

--结束END--

本文标题: 详解Java停止线程的四种方法

本文链接: https://www.lsjlt.com/news/126268.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解Java停止线程的四种方法
    一、线程停止基础知识 interrupted(): 测试当前线程是否已经中断。该方法为静态方法,调用后会返回boolean值。不过调用之后会改变线程的状态,如果是中断状态...
    99+
    2022-11-12
  • Java停止线程的3种方法
    目录1.自定义中断标识符2.interrupt中断线程3.stop停止线程总结在 Java 中停止线程的实现方法有以下 3 种: 自定义中断标识符,停止线程。使用线程中断方法 int...
    99+
    2022-11-13
  • PHP停止进程的四种方法是什么
    这篇文章主要讲解了“PHP停止进程的四种方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP停止进程的四种方法是什么”吧!第一种方法是使用exit()函数这个函数可以让程序立即停止...
    99+
    2023-07-05
  • Java开启线程的四种方法案例详解
    目录1、继承Thread类1.1 代码实现1.2 测试结果2、实现Runnable接口2.1 方式一:直接实现Runnable接口2.1.1 代码实现2.1.2 测试结果2.2 方式...
    99+
    2023-02-16
    java开启线程 java开启线程四种方法 java开启线程方式
  • Java线程同步的四种方式详解
    Java线程同步属于Java多线程与并发编程的核心点,需要重点掌握,下面我就来详解Java线程同步的4种主要的实现方式 什么是Java线程同步 当使用多个线程来访问同一个数据时,将会...
    99+
    2023-02-18
    Java 线程同步 Java线程同步的四种方式 Java使用synchronized关键字线程同步 Java使用ReentrantLock线程同步 Java使用原子变量实现线程同步 JavaThrea
  • java线程停止的方法是什么
    Java线程停止的方法有以下几种:1. 使用标志位:在Thread类中定义一个boolean类型的变量作为标志位,当标志位为true...
    99+
    2023-10-10
    java
  • Java线程的停止实现原理详解
    目录线程停止的原理如何正确停止线程在普通情况下停止线程在阻塞情况下停止线程线程在每次迭代后都阻塞停止线程的最佳实践错误停止的方法被弃用的stop,suspend和resume方法用v...
    99+
    2023-01-28
    Java线程的停止 Java线程原理
  • Java中终止线程的方法详解
    Java中终止线程的方式主要有三种:使用stop()方法,已被弃用。原因是:stop()是立即终止,会导致一些数据被到处理一部分就会被终止,而用户并不知道哪些数据被处理,哪些没有被处理,产生了不完整的“残疾”数据,不符合完整性,所以被废弃。...
    99+
    2023-05-31
    java 终止线程 ava
  • Java详解实现多线程的四种方式总结
    目录前言一、四种方式实现多线程1.继承Thread类创建线程2.实现Runnable接口创建线程3.实现Callable接口4.实现有返回结果的线程二、多线程相关知识1.Runnab...
    99+
    2022-11-13
  • java线程停止执行的方法有哪些
    Java线程停止执行的方法有以下几种:1. 使用标志位停止线程:在线程的执行过程中,通过设置一个标志位来控制线程是否停止执行。线程可...
    99+
    2023-08-08
    java
  • java自带的四种线程池实例详解
    目录java预定义的哪四种线程池?四种线程池有什么区别?线程池有哪几个重要参数?如何自定义线程池总结java预定义的哪四种线程池? newSingleThreadExexcutor:...
    99+
    2022-11-13
  • Java线程池的四种拒绝策略详解
    目录预先配置配置线程池。创建线程任务拒绝策略一:AbortPolicy拒绝策略二:CallerRunsPolicy拒绝策略三:DiscardPolicy拒绝策略四:DiscardOl...
    99+
    2022-11-13
  • Java中四种线程池的使用示例详解
    在什么情况下使用线程池? 单个任务处理的时间比较短 将需处理的任务的数量大使用线程池的好处: 减少在创建和销毁线程上所花的时间以及系统资源的开销 如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。 本文详细的给...
    99+
    2023-05-31
    java 线程池 ava
  • 防止暴力破解ssh的四种方法
    一. 方法介绍 防止暴力破解的四种方法: 1 密码要写的足够的复杂,通常建议将密码写16位,并且无连贯的数字或者字母;当然也可以固定一个时间修改一次密码,推荐是一个月修改一次会稳妥一些2 修改ss...
    99+
    2023-09-07
    ssh linux 运维 系统安全 服务器
  • Java中ArrayList初始化的四种方法详解
    目录1 起因2 解决方案2.1 双括号法2.2 Arrays.asList2.3 stream2.4 Lists3 总结1 起因 在实际业务开发中, 我们经常会遇到需要临时创建一个数...
    99+
    2022-11-12
  • java线程池的四种创建方式详细分析
    目录前言1. 线程池2. 创建方式前言 在讲述线程池的前提 先补充一下连接池的定义 连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用 可以看到其连接池...
    99+
    2022-11-13
  • Java 终止线程的几种方式
    一、正常运行结束 所谓正常运行结束,就是程序正常运行结束,线程自动结束。 public class ThreadTest extends Thread { public void run() ...
    99+
    2023-08-31
    java jvm 开发语言
  • Java线程创建的四种方式总结
    多线程的创建,方式一:继承于Thread类 1.创建一个继承于Thread类的子类 2.重写Thread类的run()--->将此线程执行的操作声明在run()中 3.创建Th...
    99+
    2022-11-12
  • 详解JAVA中获取文件MD5值的四种方法
    在Java中,可以使用以下四种方法来获取文件的MD5值:1. 使用java.security.MessageDigest类:可以使用...
    99+
    2023-08-11
    java
  • Android更新UI的四种方法详解
    前言 相信每位Android开发者们都知道更新UI只能在主线程中进行,若是在子线程执行任务后需要更新UI,则需要借助handler跳转到主线程中。以下介绍几种操作UI的方法。 ...
    99+
    2022-06-06
    方法 Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作