先介绍一下这三个方法:
中断此线程(不一定是当前线程,指Thread实例代表的线程),该方法实际上是给线程设置一个中断状态,并没有实际中断线程,线程仍会继续执行。如果interrupt()不会中断sleep,wait,join方法,就不会抛InterruptException异常,就不会清除中断标志位,isInterrupt()返回true。
如果中断sleep,wait,join方法,就会抛InterruptException异常,就会清除中断标志位,isInterrupt()返回false。(参考第二个代码示例)
测试当前线程是否中断,该方法将清除线程的中断状态。也就是说,当连续调用两次该方法,第一次使用返回true,并清除中断状态,第二次调用时由于中断状态已经被清除,将返回false。
仅仅查询中断状态来判断是否发生中断并返回true或者false。
参考示例1:
class MyThread extends Thread{
@Override
public void run() {
System.out.println("MyThread started!");
for(int i=1;;i++) {
System.out.println("loop i="+i);
if(this.isInterrupted()) {//当前为中断状态
System.out.println("检测到当前为中断状态!");
System.out.println("第一次interrupted()"+this.interrupted());
//清除中断状态
System.out.println("第二次interrupted()"+this.interrupted());
break;
}
}
System.out.println("MyThread stopped!");
}
}
public class TestInterrupt {
public static void main(String[] args) {
System.out.println("Main Thread started!");
MyThread thread=new MyThread();
thread.start();
//中断线程
thread.interrupt();
try {
Thread.currentThread().sleep(1000);//主线程等待两秒,等待MyThread线程运行结束
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread是否存活:"+thread.isAlive());
System.out.println("Main Thread stopped!");
}
}
运行结果如下:
对于中断sleep(),join(),wait()方法的情况,我们可以参考示例2:
import java.util.concurrent.TimeUnit;
class MyThread extends Thread{
@Override
public void run() {
System.out.println("MyThread started!");
for(int i=1;;i++) {
System.out.println("loop i="+i);
if(this.isInterrupted()) {//当前为中断状态
System.out.println("检测到当前为中断状态!");
break;
}
try {
Thread.currentThread().sleep(500);
} catch (InterruptedException e) {
System.out.println("第一次中断之后的isInterrupted()返回值:"+Thread.currentThread().isInterrupted());
System.out.println("-----------------再次中断线程-----------------");
//只要中断join,wait,sleep就会清除中断状态,造成线程处于无限执行的状态。所以必须在这里再次中断
Thread.currentThread().interrupt();
System.out.println("再次中断之后的isInterrupted()返回值:"+Thread.currentThread().isInterrupted());
}
}
System.out.println("MyThread stopped!");
}
}
public class TestInterrupt {
public static void main(String[] args) {
System.out.println("Main Thread started!");
MyThread thread=new MyThread();
thread.start();
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
//中断线程
thread.interrupt();
System.out.println("Main Thread stopped!");
}
}
注意上面代码当中,在捕获InterruptedException的地方,再一次的进行中断线程操作,这是因为中断join(),wait(),sleep()方法时,interrupt()方法会将中断状态清除,如果在这个地方不进行第二次中断,则线程会一直执行下去,导致占用CPU资源。所以这里必须再次进行interrupt()方法。
最后总结,关于这三个方法,interrupt()是给线程设置中断状态并不实际中断线程执行;interrupted()是检测中断并清除中断状态;isInterrupted()只查询中断状态。还有重要的一点就是interrupted()作用于当前线程,interrupt()和isInterrupted()作用于实例所代表的线程。
文章浏览阅读3.8k次,点赞2次,收藏10次。原子指标定义原子指标 = 单一业务修饰词+基础指标词根,例如:支付金额-payment_amt命名规范派生指标定义派生指标 = 多业务修饰词+基础指标词根,派生指标继承原子指标的特性,例如:T+180体系课商品复购率,其中T+180是时间修饰词、体系课复购是业务修饰词、比率是基础指标词根命名规范日期类指标命名规范命名时要遵循:业务修饰词+基础指标词根+聚合修饰词(日期修饰词)。将日期后缀加到名称后面,如下图所示:聚合类型指标命名规范命名时要遵循:业务修饰词+基础指标词根+聚
文章浏览阅读6.7k次,点赞2次,收藏2次。这个老生长谈的问题,不知困扰了多少前端开发人员,和后端程序员,其实很简单,这里写出来,让大家分享下,有很多人说,我已经设置div 100%了,怎么还没效果,我想说的是,有一个关键的东东,你没设置,html,body{height:100%;overflow:hidden;}哈哈,这回你会了吧,要同时设置。_如何让div的高度等于浏览器可见区域的高度浏览器滚动div始终覆盖浏览器的整个
文章浏览阅读147次。今天小编给大家推荐几款Mac上好用的触控板/鼠标增强工具,拥有这些软件可以为触控板添加各种自定义的快捷键和手势动作,为鼠标的右键菜单添加功能,提高工作效率。一、BetterTouchTool触控板功能增强软件,一款专为Mac用户开发的Magic Mouse鼠标功能增强制作的软件。可以触发任意键盘快捷键和100多个预定义操作的组合,您几乎可以控制Mac的每个方面。BetterTouchTool fo...
文章浏览阅读124次。首先,下载cas-server-3.5.2-releasehttp://pan.baidu.com/s/1GJ8Gscas-client-3.2.1-releasehttp://pan.baidu.com/s/1glKFB提供俩个下载地址:先从服务端配置:我是新建一个web工程cas-server将 建几个文件夹src/libssrc/loc...
文章浏览阅读4.7w次,点赞17次,收藏53次。一、css word-spacing属性设置字间距(单词的间距)word-spacing 属性增加或减少单词间的空白(即字间隔);在这个属性中,“字” 定义为由空白符包围的一个字符串。也就是说该属性是以空格为基准进行调节间距的,如果多个字母被连在一起,则会被word-spacing视为一个单词;如果汉字被空格分隔,则分隔的多个汉字就被视为不同的单词,word-spacing属性此时有效。语法:word-spacing:值;normal:定义单词间的标准空间,默认值。 length:定义单词间的固定空_css字间距
文章浏览阅读805次。最近时间比较宽裕,觉得自己可以写一些东西来总结一下工作,索性就写一篇关于安卓蓝牙的开发总结吧安卓蓝牙开发其实也就是socket的开发,同时分为服务端和客户端,下面我就按照我的开发流程来降整个的安卓蓝牙2.0开发叙述一下,蓝牙4.0BLE我也会在之后给大家更新首先,我们要注册蓝牙相关的广播并在manifest中给出相应的权限(安卓6.0之后由于相应的底层改变,注册权限的时候不仅要给蓝牙的权限
文章浏览阅读1.7k次。绘制多图关键:fig = plt.figure(1) 表示新建第几个图import matplotlib.pyplot as pltfig = plt.figure(1)plt_rec_loss = [1,2,3,4,5,6]plt_rec_recall = [4,3,6,5,8,9]plt.xlabel("epoch")plt.ylabel("loss")plt.plot(r..._matplotlib同时绘制8个图
文章浏览阅读208次。1、新建几个普通用户wukong,wuneng,wujing,他们都属于xiyouji组的成员,其中wujing没有和系统交互的shell。[root@localhost ~]# groupadd xiyouji[root@localhost ~]# useradd -g xiyouji wukong[root@localhost ~]# useradd -g xiyouji wuneng[root@localhost ~]# useradd -g xiyouji wujing[root@loc
文章浏览阅读4.8k次。同事最近在做数据分析,计算完全依赖于计算器,然后一个小规模的矩阵,就是用计算器一个个算出来;程序员看不下去,给他写了个exe,cmd下输入要求的数据,就直接给输出了。今天他在做数据分析,给了x-y数据,让我找拟合关系。先前接触过cftool,于是直接拿来用了:将x\y按照同样维度格式输入;命令行输入cftool,会出现一个窗口;将x\y数据加载;选择权重关系(同样权重就忽略此项);...
文章浏览阅读638次。OpenCL错误码转字符串(以中文表示)错误代码位:0 ~ -19、-30 ~ -68const char* errorCodeToString(cl_int errCode) { const char* err = NULL; switch (errCode) { case CL_SUCCESS: err = "CL_SUCCESS:命令成功执行,没有出现错误!"; break..._cl_exec_status_error_for_events_in_wait_list
文章浏览阅读1k次。Js代码/*** 获取本周、本季度、本月、上月的开端日期、停止日期*/var now = new Date(); //当前日期var nowDayOfWeek = now.getDay(); //今天本周的第几天var nowDay = now.getDate(); //当前日var nowMonth = now.getMonth(); //当前月var nowYear = now.getYear..._js 本周 本月 时间段
文章浏览阅读1.1w次,点赞5次,收藏25次。GD32F303ZET6低功耗例程,睡眠模式、深度睡眠模式、待机模式