当前位置:首页 > Java技术 > Java停止线程的三种方式

Java停止线程的三种方式

2022年11月07日 16:51:15Java技术8

Java停止线程的三种方式

停止线程的核心:个人认为是让线程结束执行run方法,即线程退出

围绕该核心,可以使用以下几种方式停止线程

  1. 通过标记位停止

  2. (推荐) 通过interrupted()给线程设置清除标记方式停止

  3. 通过stop方法停止,jdk过时方法,不推荐使用,有线程安全问题

通过标记位停止

代码示例:

package com.doudou;

public class TestStopThread extends Thread {
     

    // 标记位
    private static boolean stop = false;

    private String name;

    public TestStopThread(String name) {
     
        this.name = name;
    }

    @Override
    public void run() {
     
        // 通过指定标记位,让线程停止运行run方法,即线程停止运行
        while (!stop) {
     
            try {
     
                // 让线程休眠1s
                Thread.sleep(1000);
            } catch (InterruptedException e) {
     
                e.printStackTrace();
            }
            System.out.println(name + "运行中");
        }
    }

    public static void main(String[] args) throws InterruptedException {
     
        TestStopThread testStopThreadA = new TestStopThread("A");
        TestStopThread testStopThreadB = new TestStopThread("B");
        TestStopThread testStopThreadC = new TestStopThread("C");
        TestStopThread testStopThreadD = new TestStopThread("D");
        testStopThreadA.start();
        testStopThreadB.start();
        testStopThreadC.start();
        testStopThreadD.start();
        Thread.sleep(5000);
        // 使其退出while循环,即退出run方法
        stop = true;
    }
}

运行结果:

线程执行5s后,线程停止运行,程序结束

Java停止线程的三种方式 _ JavaClub全栈架构师技术笔记

通过interrupted()给线程设置清除标记方式停止

其思想跟设置标记位差不多,不过该标记位设置在线程上,若需停止线程,需要判断线程是否设置清除标记

代码示例:

package com.doudou;

public class TestInterruptedThread implements Runnable {
     

    @Override
    public void run() {
     
        // 线程没有设置清除标记,让其执行逻辑
        while (!Thread.currentThread().isInterrupted()) {
     
            System.out.println("运行中");
        }
    }

    public static void main(String[] args) throws InterruptedException {
     
        TestInterruptedThread testInterruptedThread = new TestInterruptedThread();
        Thread thread = new Thread(testInterruptedThread);
        thread.start();
        Thread.sleep(5000);
        // 给线程设置清除标记
        thread.interrupt();
    }
}

执行结果:

线程执行5s后,线程停止运行,线程结束

Java停止线程的三种方式 _ JavaClub全栈架构师技术笔记

注意:

此种方式无法停止阻塞中的线程,比如线程正在执行sleep、wait方法等,会抛出java.lang.InterruptedException: sleep interrupted异常。

代码示例:

package com.doudou;

public class TestInterruptedThread implements Runnable {
     

    @Override
    public void run() {
     
        // 线程没有设置清除标记,让其执行逻辑
        while (!Thread.currentThread().isInterrupted()) {
     
            try {
     
                Thread.sleep(1000);
            } catch (InterruptedException e) {
     
                e.printStackTrace();
            }
            System.out.println("运行中");
        }
    }

    public static void main(String[] args) throws InterruptedException {
     
        TestInterruptedThread testInterruptedThread = new TestInterruptedThread();
        Thread thread = new Thread(testInterruptedThread);
        thread.start();
        Thread.sleep(5000);
        // 给线程设置清除标记
        thread.interrupt();
    }
}

执行结果:

程序抛出java.lang.InterruptedException: sleep interrupted异常,且线程继续执行,没有终止

Java停止线程的三种方式 _ JavaClub全栈架构师技术笔记

作者:猛男走天下
来源链接:https://blog.csdn.net/qq_33537014/article/details/119084479

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/68319.html

标签: Java
分享给朋友:

“Java停止线程的三种方式” 的相关文章

Java 并发核心机制

Java 并发核心机制

📦 本文以及示例源码已归档在 javacore 一、J.U.C 简介 Java 的 java.util.concurrent 包(简称 J.U.C)中提供了大量并发工具类,是 Java 并发能力的主要体现(注意,不是全部,有部分并发能力的支持在其他包中)。...

java中将英尺换算为身高

java中将英尺换算为身高

直接上代码 如图所示便是身高的换算,你学到了吗?、 int foot; double inch; Scanner in=new Scanner(System.in); foot=in.nextInt(); inch=in.nextDouble...

Java对象的大小

基本数据的类型的大小是固定的,这里就不多说了。对于非基本类型的Java对象,其大小就值得商榷。 在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小。看 下面语句: Object ob = new Ob...

全网最细笔记java与kotlin的一些异同

本文主要介绍java与kotlin的一些异同 后面可能还会继续比较kotlin和dart 期待吗? 打印日志 Java System.out.print("Amit Shekhar"); S...

编写高质量代码改善java程序的151个建议——[52

编写高质量代码改善java程序的151个建议——[52

原创地址:   http://www.cnblogs.com/Alandre/  (泥沙砖瓦浆木匠),需要转载的,保留下! Thanks Although the world is full of...

Java集合---面试题

HashMap的工作原理是近年来常见的Java面试题。几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道Hashtable和HashMap之间的区别,那么为何这道面试题如此特殊呢?是因为这道题考察的深度很深。这题经常出现在高级或中高级面试中,甚至会要求你实现...

Java NIO之Selector(选择器)

Java NIO之Selector(选择器)

历史回顾: Java NIO 概览 Java NIO 之 Buffer(缓冲区) Java NIO 之 Channel(通道) 其他高赞文章: 面试中关于Redis的问题看这篇就够了 一文轻松搞懂redis集群原理及搭建与使用 超详细的Java...

Java回顾之反射

Java回顾之反射

这是针对Java进行回顾的一系列文章,这篇主要是和反射相关。   第一篇:Java回顾之I/O   第二篇:Java回顾之网络通信   第三篇:Java回顾之多线程   第四篇:Java回顾之多线程同步   第五篇:Java回顾之集合  ...

初探设计:Java接口和抽象类何时用?怎么用?

初探设计:Java接口和抽象类何时用?怎么用?

今天犯了个错: “接口变动,伤筋动骨,除非你确定只有你一个人在用”。哪怕只是throw了一个新的Exception。哈哈,这是我犯的错误。 一、接口和抽象类 类,即一个对象。 先抽象类,就是抽象出类的基础部分,即抽象基类(抽象类)。官...

Java:Java快速入门

Java:Java快速入门

你好,世界! 源代码组织方式 Java程序由package+class组成,package对应目录的相对路径,class对应文件,如 E:\Workspaces\MyEclipse 10\JavaStudy\src\com\happyframework\javastu...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。