线程stop和Interrupt
一:stop终止线程
举例子:
public class ThreadStop { public static int i;
public static int j; public static void main(String[] args) throws InterruptedException {
ThreadStop stop = new ThreadStop();
stop.test();
} public void test() throws InterruptedException { Thread thread = new Thread(new Runnable() {
@Override
public void run() {
i++;
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
j++;
}
});
thread.start();
Thread.sleep(1000);
//存在线程安全问题,破坏线程的原子性
thread.stop();
System.out.println("i= " + i + ", j= " + j);
}
}
上述例子中,最后输出的i和j一个是1一个是0,按照正常情况,两个值应该都是1才对,所以可以看到,调用了stop之后,出现了这种问题,也就是说stop存在线程安全问题,会破坏线程的原子性。
二:Interrupt
Interrupt不会真的中止线程,只是给线程加上了一个标识,即isInterrupted从false变成了true;要是线程处于waiting、time waiting状态,再调用Interrupt会清除线程的阻塞状态,使线程状态变为runnable,而且isInterrupted也会从true变回false。下面举例子说明:
public static void main(String[] args) throws InterruptedException {
ThreadInterrupt1 thread = new ThreadInterrupt1();
thread.test();
} public void test() throws InterruptedException {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
System.out.println(Thread.currentThread().isInterrupted());
System.out.println(Thread.currentThread().getState());
}
}
});
thread.start();
Thread.sleep(1000);
thread.interrupt();
}
代码运行结果如下:
可以看到线程刚开始运行的时候isInterrupted是false,运行一会之后,isInterrupted变成了true。
栗子2:
public void test2() throws InterruptedException {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
System.out.println("running......");
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println(Thread.currentThread().isInterrupted());
System.out.println(Thread.currentThread().getState());
}
}
}
});
thread.start();
Thread.sleep(1000);
thread.interrupt();
}
上面代码,线程sleep后处于阻塞状态,这个时候去执行Interrupt,会报java.lang.InterruptedException: sleep interrupted异常,而且线程的状态也变成了runnable,isInterrupted也从true变回false,并且打印running语句会继续执行,说明线程并没有真的被中止。运行结果如下:
栗子3:
public void test3() throws InterruptedException {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
//中止线程的正确方式,加个判断
while (!Thread.currentThread().isInterrupted()) {
System.out.println("running......");
Thread.currentThread().interrupt();
}
}
});
thread.start();
Thread.sleep(1000);
thread.interrupt();
}
上面的例子,能够正确的把线程中止,输出结果如下:
可以看到,输出一次之后就中止了线程,线程没有再挂起。
OK,到此结束。
线程stop和Interrupt的更多相关文章
- 关于java线程中stop interrupt daemon wait notify
一.关于终止线程stop与interrupt 一般来说,线程执行结束后就变成消亡状态,乍看之下我们并不需要人为进行干预(人为停止线程),不过凡事都有例外吧,在服务器或者其他应用场景下,线程为了提供服务 ...
- Java - 线程Join与interrupt
Java多线程系列--“基础篇”08之 join() 概要 本章,会对Thread中join()方法进行介绍.涉及到的内容包括:1. join()介绍2. join()源码分析(基于JDK1.7.0_ ...
- Java-----多线程sleep(),join(),interrupt(),wait(),notify()的作用
关于Java多线程知识可以看看<Thinking in Java >中的多线程部分和<Java网络编程>中第5章多线程的部分 以下是参考<<Java多线程模式> ...
- 线程中断方法interrupt() 与 cancel()
(一).关于interrupt() interrupt()并不直接中断线程,而是设定一个中断标识,然后由程序进行中断检查,确定是否中断. 1. sleep() & interr ...
- Java 线程的终止-interrupt
Java线程的终止——interrupt 取消/关闭的场景 我们知道,通过线程的start方法启动一个线程后,线程开始执行run方法,run方法运行结束后线程退出,那为什么还需要结束一个线程呢?有多种 ...
- 从头认识java-17.2 线程中断(interrupt)
这一章节我们来讨论一下线程中断(interrupt). 1.什么是线程中断(interrupt)? 就是在多线程执行的时候,我们给线程贴上一个中断的标记.可是不要求线程终止. 2.样例: 中断的样例: ...
- 停止Java线程,小心interrupt()方法
来源:http://blog.csdn.net/wxwzy738/article/details/8516253 程序是很简易的.然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决 ...
- 线程的中断.interrupt
线程对象.interrupt() 注意,异常分析中要有break,否则无法中断 public class Demo extends JFrame { private Thread thread;//定 ...
- 中断线程详解(Interrupt)
在上篇文章<多线程的使用——Thread类和Runnable接口>中提到中断线程的问题.在JAVA中,曾经使用stop方法来停止线程,然而,该方法具有固有的不安全性,因而已经被抛弃(Dep ...
- java线程中的interrupt,isInterrupt,interrupted方法
在java的线程Thread类中有三个方法,比较容易混淆,在这里解释一下 (1)interrupt:置线程的中断状态 (2)isInterrupt:线程是否中断 (3)interrupted:返回线程 ...
随机推荐
- 【python】递归听了N次也没印象,读完这篇你就懂了
听到递归总觉得挺高大上的,为什么呢?因为对其陌生,那么今天就来一文记住递归到底是个啥. 不过先别急,一起来看一个问题:求10的阶乘(10!). 求x的阶乘,其实就是从1开始依次乘到x.那么10的阶乘就 ...
- 1095 Cars on Campus——PAT甲级真题
1095 Cars on Campus Zhejiang University has 6 campuses and a lot of gates. From each gate we can col ...
- MongoDB语句命令
更新列名 db.xx.update({}, {$rename : {"StoreId" : "MetaId"}}, false, true) 查询长度 db.g ...
- 痞子衡嵌入式:串行NOR Flash的DQS信号功能简介
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是串行NOR Flash的DQS信号功能. 串行NOR Flash在嵌入式里的应用相当广泛,既可用作数据存储也可以用作代码(XiP)存储, ...
- luogu4464:莫比乌斯反演,积性函数和伯努利数
题目链接:https://www.luogu.com.cn/problem/P4464 简记$gcd(x,y)=(x,y)$. 推式子: $\sum_{i=1}^{n}{(i,n)^xlcm(i,n) ...
- idea将文件push之后如何回退
- 看完了进程同步与互斥机制,我终于彻底理解了 PV 操作
尽人事,听天命.博主东南大学硕士在读,热爱健身和篮球,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步 本文已收录于 CS-Wiki(Gitee 官 ...
- 前端问题录——在导入模块时使用'@'时提示"Modile is not installed"
前情提要 为了尽可能解决引用其他模块时路径过长的问题,通常会在 vue.config.js 文件中为 src 目录配置一个别名 '@' configureWebpack: { resolve: { a ...
- 读懂一个中型的Django项目
转自https://www.cnblogs.com/huangfuyuan/p/Django.html [前言]中型的项目是比较多的APP,肯会涉及多数据表的操作.如果有人带那就最好了,自己要先了解基 ...
- kubernetes cpu限制参数说明
docker CPU限制参数 Option Description --cpus=<value> Specify how much of the available CPU resourc ...