thread java 关闭_怎么在java中关闭一个thread

怎么在java中关闭一个thread

我们经常需要在java中用到thread,我们知道thread有一个start()方法可以开启一个线程。那么怎么关闭这个线程呢?

有人会说可以用Thread.stop()方法。但是这个方法已经被废弃了。

根据Oracle的官方文档,Thread.stop是不安全的。因为调用stop方法的时候,将会释放它获取的所有监视器锁(通过传递ThreadDeath异常实现)。如果有资源该监视器锁所保护的话,就可能会出现数据不一致的异常。并且这种异常很难被发现。 所以现在已经不推荐是用Thread.stop方法了。

那我们还有两种方式来关闭一个Thread。

Flag变量

如果我们有一个无法自动停止的Thread,我们可以创建一个条件变量,通过不断判断该变量的值,来决定是否结束该线程的运行。

public class KillThread implements Runnable {

private Thread worker;

private final AtomicBoolean running = new AtomicBoolean(false);

private int interval;

public KillThread(int sleepInterval) {

interval = sleepInterval;

}

public void start() {

worker = new Thread(this);

worker.start();

}

public void stop() {

running.set(false);

}

public void run() {

running.set(true);

while (running.get()) {

try {

Thread.sleep(interval);

} catch (InterruptedException e){

Thread.currentThread().interrupt();

log.info("Thread was interrupted, Failed to complete operation");

}

// do something here

}

log.info("finished");

}

public static void main(String[] args) {

KillThread killThread= new KillThread(1000);

killThread.start();

killThread.stop();

}

}

上面的例子中,我们通过定义一个AtomicBoolean 的原子变量来存储Flag标志。

我们将会在后面的文章中详细的讲解原子变量。

调用interrupt()方法

通过调用interrupt()方法,将会中断正在等待的线程,并抛出InterruptedException异常。

根据Oracle的说明,如果你想自己处理这个异常的话,需要reasserts出去,注意,这里是reasserts而不是rethrows,因为有些情况下,无法rethrow这个异常,我们需要这样做:

Thread.currentThread().interrupt();

这将会reasserts InterruptedException异常。

看下我们第二种方法怎么调用:

public class KillThread implements Runnable {

private Thread worker;

private final AtomicBoolean running = new AtomicBoolean(false);

private int interval;

public KillThread(int sleepInterval) {

interval = sleepInterval;

}

public void start() {

worker = new Thread(this);

worker.start();

}

public void interrupt() {

running.set(false);

worker.interrupt();

}

public void stop() {

running.set(false);

}

public void run() {

running.set(true);

while (running.get()) {

try {

Thread.sleep(interval);

} catch (InterruptedException e){

Thread.currentThread().interrupt();

log.info("Thread was interrupted, Failed to complete operation");

}

// do something here

}

log.info("finished");

}

public static void main(String[] args) {

KillThread killThread= new KillThread(1000);

killThread.start();

killThread.interrupt();

}

}

上面的例子中,当线程在Sleep中时,调用了interrupt方法,sleep会退出,并且抛出InterruptedException异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

arp欺骗原理

中间人攻击——ARP欺骗的原理、实战及防御 ​ 1.1 什么是网关 首先来简单解释一下什么是网关,网关工作在OSI七层模型中的传输层或者应用层,用于高层协议的不同网络之间的连接,简单地说,网关就好比是一个房间通向另一个房间的一…

bzoj 3926

后缀自动机扩展到树形结构上。 先建出大的Trie,然后我们得到了一棵Trie树,对于树上的每个节点,保存一个后缀自动机从根走它代表的字符串后到达的节点,每次其儿子就从父亲的这个节点开始扩展。 1 /*******************************…

java memcmp_memcmp,memicmp函数

函数原型:extern int memcmp(void *str1, void *str2, unsigned int n)参数说明:str1和str2为指定作比较的字符串,比较两个字符串的前n个字节。所在库名:#include 函数功能:比较字符串str1和str2在内存区域中的的前n个…

Pycharm社区版安装教程(永久免费,随时升级)

首先进入JetBrain的官网(国内正常访问): https://www.jetbrains.com/ 第一眼看到的界面如下图所示: 然后找到我们的Pycharm专题页: 进入Pycharm的专题页面之后,点击下载按钮(这里有两个按钮,点任何一个都行): 然后进入到真正的下载页面你会发现有两个版本的Pycharm,一个…

apache-cxf 使用_使用Apache CXF进行Web服务学习

apache-cxf 使用在我的最后几个项目中,我使用了Web服务,在某些地方创建它们并在其他地方使用它们。 我认为标准任务(例如创建客户端,创建Web服务等)非常简单,如果遇到问题,有足够的资源。 但是对…

123 Best time to buy and sell stock iii

题解: 根据题目要求,最多进行两次买卖股票,而且手中不能有2只股票,就是不能连续两次买入操作。 所以,两次交易必须是分布在2各区间内,也就是动作为:买入卖出,买入卖出。 进而&#…

解决 invalid input detected at ‘^’ marker的问题

粉丝求助: 解决办法: Switch开不了机(机器bai黑屏,如果找很黑的房间能看到屏du幕内部有zhi点透亮光); 解决方法:这dao是假死机,按住电源键12秒强制关机,然后再按电源键能…

PyCharm社区版设置简体中文界面

点击“File”,出现的菜单中点击“Settings”, 在弹出的界面中,选“Plugins”, 然后在右边输入框中输入“chinese”, 在搜索结果中,选中Chinese(Simplified) Language Pack,点击右边的“install”即可。

JMS和AWS SQS的更多高级内容

如您所知, AWS中的SQS SQS代表“简单队列服务”。 最近,在使用它的同时,我发现了将其称为“简单”的原因之一。 在之前的两篇文章( 此处和此处 )中,我展示了结合Spring Framework将SQS用作JMS队列提供程序 …

w10家庭版安装java不_小编为你分析win10系统安装不了java的设置办法

许多win10系统用户在工作中经常会遇到win10系统安装不了java的情况,想必大家都遇到过win10系统安装不了java的情况吧,那么应该怎么处理win10系统安装不了java呢?我们依照1、查看自己的电脑是32位的还是64位的(x86代表32位的)。java安装要求比…

用C语言实现津巴布韦这道算法题?

粉丝求助: 题目内容如下: 5、津巴布韦 由于计划经济失败,津巴布韦称为世界上通胀率最高的国家。这里的物价即使在一天中也会持续上涨,所以必须实时更新物品价格。例如:1个鸡蛋的价格为35亿津巴布韦元,所以超市做了每位数字的活动标价牌。 钟旭在穆加贝超市打工,有一天遇…

盘点几种数据库的分页SQL的写法(转)

Data序列——盘点几种数据库的分页SQL的写法http://www.cnblogs.com/fireasy/archive/2013/04/10/3013088.html 转载于:https://www.cnblogs.com/wangjunwei/p/4522834.html

dnslog盲注

dnslog盲注dnslog注入原理DNSlog工具什么情况下使用dnslog注入?Mysql DNSlog原理图DNSlog盲注利用条件DNSlog盲注操作方式实战演练查询当前数据库名:查询当前数据库的第一个表名:查询第users表一个列名:查询users表的username列的…

Python在cmd中配置虚拟环境ERROR: Command errored out with exit status 1:

粉丝求助: 解决办法: 具体步骤: 1.查看Python版本 2.Pythonlibs 中找到对应版本的whl文件,cp37代表3.7版本,win32代表Windows系统32位机,根据自己的电脑位数选择。

java sqlserver ssl_拦截SQLSERVER的SSL加密通道替换传输过程中的用户名密码实现运维审计(一)...

工作准备•一台SQLSERVER 2005/SQLSERVER 2008服务•SQLSERVER jdbc驱动程序•Java开发环境eclipse jdk1.8•java反编译工具JD-Core反编译JDBC分析SQLSERVER客户端与服务器通信原理SQLServerConnection.class1、经过反编译分析SQLServerConnection.class文件我们可以看到登录时…

1-9其他数据库注入

文章目录 数据库注入access数据库判断access数据库常用函数查询语句构造联合查询布尔型盲注 mssql数据库mssql数据库判断环境---靶机-2k3_sp2常用函数查询语句构造联合查询报错注入布尔型盲注 数据库注入 access数据库 判断access数据库 根据url的后缀。ASP为后缀名…

tp框架 db::name_玩! 框架:为什么我会爱上它

tp框架 db::name前一段时间,我是房地美,房地美,Foreclosure.com和HUD等公司在房地产市场上进行一些大型部署的技术负责人。 我们运行的是您可能熟悉的传统企业Java堆栈-Spring , Hibernate ,Solr等。花了几年时间&…

自动化专业向往硬件方面靠,有什么好的建议?

我的建议是: 有能力考研就先考研,考不上可以选择就业,学历还是很重要的,门槛。自动化可以找一些相关的知名企业,按照他们的招聘要求要求自己,往这个方法发展,垂直领域研究很深,你就是大佬和专家。 有个帖子讲的挺全的,虽然是文章:自动化人生 下面是理论内容,我直接…

java 内存数据库 sql_ssm+redis +Maven用于内存数据库 (No Sql)入门demo

最近一直是以自学的状态,想把自己学习到的知识分享给大家 ,也是好久没有写博客了。废话不多说 ,直接上代码。本次项目是 用maven 管理的.开发工具 eclipse在pom.xml文件中,中关于redis的配置:org.springframework.data…

Fitness - 05.23

倒计时222天 运动40分钟,共计8组,4.2公里。拉伸10分钟。 每组跑步3分钟(6.5KM/h),走路2分钟(5.5KM/h)。 终于赶在姨妈前完成第3周的跑步训练了,可喜可贺~~ 下周预计要休息了orz... 祈…