java如何正常关闭一个线程

2023-11-11

如何关闭一个线程

  1. 调用stop方法。该方法存在一个问题,JDK官方不推荐使用,该方法在关闭线程时可能不会释放掉monitor的锁,所以建议不要使用该方法结束线程。
  2. 正常关闭
    (2.1)线程正常结束生命周期
    线程运行结束,完成自己的使命之后,就会正常退出,如果线程中的任务耗时比较短,或者时间可控,那么放任它正常结束就好。
    (2.2)捕获中断信号关闭线程
    代码如下:
import java.util.concurrent.TimeUnit;
public class InterruptThreadExit {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread() {
            @Override
            public void run() {
                System.out.println("I will start work");
                while (!isInterrupted()) {
                    //working
                }
                System.out.println("I will be exiting.");
            }

        };
        t.start();
        TimeUnit.SECONDS.sleep(10);
        System.out.println("System will be shutdown");
        t.interrupt();
    }
}

(2.3)使用volatile开关控制
由于线程的interrup标识很有可能被擦除,或者逻辑单元中不会调用任何可中断方法,所以使用volatile修饰的开关flag关闭线程也是一种常用的做法,代码如下:

import java.util.concurrent.TimeUnit;
public class FlagThreadExit {
    static class MyTask extends Thread{
        private volatile boolean closed = false;
        @Override
        public void run() {
            System.out.println("I will start work");
            while (!closed /*&& !isInterrupted()*/){
                //working
            }
            System.out.println("I will be exiting");
        }
        public void close(){
            this.closed = true;
//            this.interrupt();
        }
    }
    public static void main(String[] args) throws InterruptedException {
        MyTask myTask = new MyTask();
        myTask.start();
        TimeUnit.SECONDS.sleep(10);
        myTask.close();
    }
}

3.异常退出
在一个线程的执行单元中,是不允许抛出checked异常的,不论Thread中的run方法,还是Runnable中的run方法,如果线程在运行过程中不需要捕获checked异常并且判断是否还有运行下去的必要,那么此时可以将checked异常封装成unchecked异常(RuntimeException)抛出进而结束生命周期。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java如何正常关闭一个线程 的相关文章

  • 如何在java swing中的每个页面中打印带有页脚的整个JPanel

    好吧 这可能很简单 但想不通 我有一个包含 JTable 的 JPanel JTable 包含很少的行 有时更多 因为我推入其中的表模型取决于数据库 但是 我不使用任何包含 JTable 的 JScolpane 因此 当 JTable 包含
  • Android NumberPicker 带字符串

    I have customised the NumberPicker to show text The output is this 当我按 确定 时 我想将 e x 鼠标添加到我的列表 文章 中 我得到的是索引值 int 它由 array
  • JAVA - 带有特殊字符的 LDAP 密码不起作用

    我试图在我的系统上创建一个登录屏幕 在 Active Directory 中进行查询 但是当用户的密码包含一些特殊字符 如 和 时 它不会验证 我需要加密密码才能工作吗 我该怎么做 我使用 getPassword 通过 JPasswordF
  • 如何自定义BlockingQueue的阻塞行为

    我想创建一个阻塞队列 它根据自定义规则而不是队列中的项目数量来阻止生产者 例如 生产者生成一些文件并放入队列中 消费者经过一番分析后将它们转移到特定位置 对于上述场景 如果队列中的总文件大小达到某个阈值 我希望生产者等待生成新文件 如果总大
  • 如何使用 SLF4J 和 Log4j2 记录 FATAL(或任何自定义日志级别)

    我有那些具体的要求 需要能够登录FATAL level 需要使用SLF4J 需要使用Log4j2 现在 这是我的执行 final Logger logger LoggerFactory getLogger HelloWorld class
  • 使用 Java 编程式 HTML 文档生成

    有谁知道如何在 Java 中以编程方式生成 HTMLDocument 对象 而不需要在外部生成字符串 然后使用 HTMLEditorKit read 来解析它 我问的两个原因 首先 我的 HTML 生成例程需要非常快 并且我认为将字符串解析
  • 从 eclipse 运行时 java.io.FileNotFoundException: (没有这样的文件或目录)

    我正在写入文件并想要控制台输出 TODO Create a game engine and call the runGame method public static void main String args throws Excepti
  • 方法不必要地被调用?

    我有一个 BaseActivity 它可以通过其他所有活动进行扩展 问题是 每当用户离开 暂停 活动时 我都会将音乐静音 我也不再接听电话 问题是 onPause每当用户在活动之间切换时就会被调用 这意味着应用程序不必要地静音和停止tele
  • 如何消除警告:使用“$”而不是“.”对于 Eclipse 中的内部类

    我是 Android 开发新手 当我将 eclipse 和 Android SDK 更新到最新版本后 我收到警告 Use instead of for inner classes or use only lowercase letters
  • getClassLoader().getResource() 返回 null

    我有这个测试应用程序 import java applet import java awt import java net URL public class Test extends Applet public void init URL
  • Vertx HttpClient getNow 不工作

    我的 vertx HttpClient 有问题 下面的代码显示使用 vertx 和纯 java 测试 GET Vertx vertx Vertx vertx HttpClientOptions options new HttpClientO
  • 在 Mac 上使用 JRE 打开 jar 文件

    我有一个 jar 文件 旨在通过命令行运行 我不打算在运行应用程序的机器上进行任何java开发 我的思考过程是 因此我应该只需要JRE而不是JDK 此外 JDK 大约是 JRE 的 4 倍 我不想下载它 在 Mac 上安装 JRE 时 它不
  • 如何在将数据发送到 Firebase 数据库之前对其进行加密?

    我正在使用 Firebase 实时数据库制作聊天应用程序 我知道 Firebase 非常安全 只要您的规则正确 但我自己可以阅读使用我的应用程序的人的所有聊天记录 我想阻止这种情况 为此我需要一种解密和加密方法 我尝试使用凯撒解密 但失败了
  • .class 与 .java

    class 文件和 java 文件有什么区别 我正在尝试让我的小程序工作 但目前我只能在 Eclipse 中运行它 还不能嵌入 HTML 谢谢 编辑 那么如何使用 JVM 进行编译呢 class 文件是编译后的 java 文件 java 都
  • Scala repl 抛出错误

    当我打字时scala在终端上启动 repl 它会抛出此错误 scala gt init error error while loading AnnotatedElement class file usr lib jvm java 8 ora
  • Android 中的字符串加密

    我正在使用代码进行加密和加密 它没有给出字符串结果 字节数组未转换为字符串 我几乎尝试了所有方法将字节数组转换为字符 但没有给出结果 public class EncryptionTest extends Activity EditText
  • Java泛型类型

    当我有一个界面时 public interface Foo
  • 监控 Java 应用程序上的锁争用

    我正在尝试创建一个小基准 在 Groovy 中 以显示几个同步方法上的高线程争用 当监控自愿上下文切换时 应该会出现高争用 在 Linux 中 这可以通过 pidstat 来实现 程序如下 class Res private int n s
  • Java 9 中紧凑字符串和压缩字符串的区别

    有什么优点紧凑的字符串 http openjdk java net jeps 254JDK9 中的压缩字符串 压缩字符串 Java 6 和紧凑字符串 Java 9 都有相同的动机 字符串通常实际上是 Latin 1 因此浪费了一半的空间 和
  • 如何在Java中跨类共享变量,我尝试了静态不起作用

    类 Testclass1 有一个变量 有一些执行会改变变量的值 现在在同一个包中有类 Testclass2 我将如何访问 Testclass2 中变量的更新值 由 Testclass1 更新 试过这个没用 注意 Testclass1和Tes

随机推荐

  • 电信aep平台和iot平台区别_移远BC95使用CoAP协议接入华为IoT平台

    点击上方蓝色字体 关注我们 BC95的CoAP测试需要云平台配合 当前的支持CoAP协议的平台有华为OceanConnect平台 电信天翼云 除了 Logo 其他和华为的一样 移动 OneNet等 此教程以华为的OceanConnect 平
  • leetcode 第55题 跳跃游戏

    题目 给定一个非负整数数组 nums 你最初位于数组的 第一个下标 数组中的每个元素代表你在该位置可以跳跃的最大长度 判断你是否能够到达最后一个下标 示例1 输入 nums 2 3 1 1 4 输出 true 解释 可以先跳 1 步 从下标
  • 习题8-6 删除字符 (20分)

    本题要求实现一个删除字符串中的指定字符的简单函数 函数接口定义 void delchar char str char c 其中char str是传入的字符串 c是待删除的字符 函数delchar的功能是将字符串str中出现的所有c字符删除
  • Python01-- Python遇到的代码错误:TypeError: __init__() missing 1 required positional argument: ‘priviledges‘

    Python遇到的代码错误 TypeError init missing 1 required positional argument priviledges 这是在学习python中遇到的一个问题 是关于类的参数问题 说到底还是对类的知识
  • 查看tenorflow对python版本的要求

    查看tenorflow对python版本的要求 一 前言 由于不同版本的tensorflow对所支持的python版本有所限制 两者不匹配则无法使用 所以我们在安装tensorflow时 应该查看与python版本相匹配的tensorflo
  • 安装SQL Server详细教程

    安装SQL Server2019详细教程 1 官网下载SQL Server 2019 Developer Developer下载地址 下载完成后 打开安装程序 选择自定义安装 选择安装路径 不推荐安装在C盘 然后等待下载安装 此过程较为缓慢
  • 华为手机微信如何与电脑连接到服务器,有华为手机,还用微信QQ传文件到电脑?Huawei share秒传了解一下...

    原标题 有华为手机 还用微信QQ传文件到电脑 Huawei share秒传了解一下 华为手机用户 还用微信 QQ传文件到电脑 Huawei share秒传了解一下 我们在办公的时候 难免需要手机和电脑之间互传文件 很多朋友都会选择用微信或者
  • jstl详解

    原文地址 http www blogjava net maverick1003 articles 236575 html JSTL标签库的使用是为类弥补html表的不足 规范自定义标签的使用而诞生的 在告别modle1模式开发应用程序后 人
  • nuxt框架快速了解

    公司最近有一个文献检索系统的研发项目 也让我第一次接触到Nuxt js框架 Nuxt js 是一个基于 Vue js 的通用应用框架 它可以通过对客户端 服务端基础架构的抽象组织 Nuxt js 主要关注的是应用的 UI渲染 Nuxt js
  • Linux系统入门----虚拟机安装CentOS,jdk,tomcat,mysql的配置[笔记]

    随着学习的深入 要捣鼓一下Linux系统 还不错 虽然不如deepin系统那么好看 但是对于企业来讲常常用CentOS 这不我又开始搞事情了 大家习惯用Vmware或者VirtureBox但是Win10自带一个虚拟机软件 可以不用再下载Vm
  • matlab-lsqcurvefit函数

    lsqcurvefit函数 least squares curve fitting 用于最小二乘法求解非线性曲线拟合问题 即已知输入向量xdata和输出向量ydata 并且知道输入与输出的函数关系为ydata F x xdata 但不知道系
  • 新手做短视频自媒体,还在为做什么领域发愁?这里有没有你喜欢的

    很多新手小白都会遇到这样的情况 一看到镜头就紧张 脸红 说不出话来 或者没有什么才艺 又没有颜值 但也想通过做短视频自媒体赚钱 今天大周给你们推荐几个新手不用露脸也能做的短视频领域 可以选一个自己喜欢或合适自己的去尝试一下 一 音乐领域 1
  • 【FPGA内部RAM原理及应用场景分析】- 从内部RAM简介、分类、存储器方式以及不同场景下的应用四个方面来详细阐述FPGA内部RAM的原理和应用。

    FPGA内部RAM原理及应用场景分析 从内部RAM简介 分类 存储器方式以及不同场景下的应用四个方面来详细阐述FPGA内部RAM的原理和应用 FPGA内部RAM简介 FPGA内部RAM是一种集成在FPGA芯片内部的存储器 它可以用于高速数据
  • cuihua 2022.4.11-17BUU刷题记录

    25 MRCTF2020 摇滚DJ 1 题目概述 2 解题过程 听了一下 真难听 audacity打开 波形是平的 和前面那道题有点像 kali的qsstv工具 安装qsstv apt install qsstv 安装成功后 在终端下输入q
  • pytorch: 网络权重初始化

    构建完网络后 往往需要初始化权重 其实也可以不需手动初始化 在声明网络时 pytorch有默认的初始化方式 如 import torch x torch Tensor 2 2 print x 输出为 tensor 2 0363e 09 4
  • SQL之sqli-labs注入Less-2~4

    一 Less 2 与Less 1相同 我们同样使用 id 1 看是否可以注入 发现不可以 并且提示错误 我们可以知道 这里不需要引号 这就是与Less 1不同的地方 除此之外 以下步骤与Less 1相同 2 接下来我们使用 order by
  • PHP数据接收和使用

    接受来自js发送的数据 有几种接收方式 1 GET u GET user 2 POST P POS 3 REQUEST 两种传输方式的数据都可以接收 q REQUEST 创建虚拟服务器完成后操作 数据表格的方法 链接数据库 link new
  • springboot启动报错Error creating bean with name requestMappingHandlerMapping defined in class path resou

    springboot启动报错 Error creating bean with name requestMappingHandlerMapping defined in class path resource org springframe
  • python 批量读取txt文件

    1 python 批量读取txt文件 不读 注释的部分 并将数据保存为dataframe格式 代码 import re import glob import pandas as pd path data txt 指定txt文件所在文件夹路径
  • java如何正常关闭一个线程

    如何关闭一个线程 调用stop方法 该方法存在一个问题 JDK官方不推荐使用 该方法在关闭线程时可能不会释放掉monitor的锁 所以建议不要使用该方法结束线程 正常关闭 2 1 线程正常结束生命周期 线程运行结束 完成自己的使命之后 就会