interrupted():测试当前线程【运行此方法的当前线程】是否已经是中断状态,执行后具有将状态标志清除为false的功能。

isInterrupted():测试线程对象是否已经是中断状态,但不清除状态标志。

interrupted()的例子:

public static void main(String[] args) {
try{
MyThread thread = new MyThread();
thread.start();
Thread.sleep(1000);
thread.interrupt();
syso(thread.interrupted());
syso(thread.interrupted());
}catch(InterruptedException e) {
e.printStackTrace();
}
}
//运行结果
false
false

从上可以看出thread.interrupted()执行的是运行当前方法的线程,而不是thread线程,而由于main线程一直没有停止,所以一直是false。

public static void main(String[] args) {
Thread.currentThread().interrupt();
syso(Thread.interrupted());
syso(Thread.interrupted());
}
//运行结果
true
false

从上可以看出Thread.currentTrhead().interrupt()将main线程停止了,所以下面第一个是true状态,而第二个是false状态,就是因为interrupted()方法有清空状态标志的功能。

isInterrupted()的例子:

public static void main(String[] args) {
try{
MyThread thread = new MyThread();
thread.start();
Thread.sleep(1000);
thread.interrupt();
syso(thread.isInterrupted());
syso(thread.isInterrupted());
}catch(InterruptedException e) {
e.printStackTrace();
}
}
//运行结果
true
true

从上面可以看出isInterrupted()就是线程对象是否中断。

interrupt()并不能真正的结束线程:

public class MyThread extends Thread{
public void run() {
super.run();
for(int i = 0; i < 5; i++) {
if(this.interrupted()) {
System.out.println("已经是停止状态了!我要退出了!");
break;
}
System.out.println("i = " + i);
}
System.out.println("for之后代码");
}
}
public class Main { public static void main(String[] args) {
try {
MyThread thread = new MyThread();
thread.start();
Thread.sleep(2000);
thread.interrupt();
} catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println("结束了");
} }

运行结果:

可以发现interrupt()并没有真正终止线程。下面介绍几种可以终止线程的方法:

1.异常法【建议使用】:

if(this.interrupted()) {
System.out.println("已经是停止状态了!我要退出了!");
throw new InterruptedException();
break;
}

在上面需要正常终止的地方抛出异常即可。

此方法最推荐使用,因为在catch块中还可以将异常向上抛,使线程停止的事件得以传播。

2.在sleep中interrupt():

public class SleepThread extends Thread{
public void run() {
super.run();
try {
System.out.println("run begin");
Thread.sleep(200000);
System.out.println("run end");
} catch(InterruptedException e) {
System.out.println("沉睡中停止,进入catch");
e.printStackTrace();
}
}
}
public class SleepMain { public static void main(String[] args) {
try {
SleepThread thread = new SleepThread();
thread.start();
Thread.sleep(200);
thread.interrupt();
} catch(InterruptedException e) {
System.out.println("main catch");
e.printStackTrace();
}
System.out.println("结束了");
} }

运行结果:

3.使用作废的stop()方法:

调用stop()方法会强制让线程停止则有可能使一些清理性的工作得不到完成。并且有可能对锁定对象进行了“解锁”,导致数据得不到同步处理,出现数据不一致问题。

4.return法:

public class ReturnThread extends Thread{
public void run() {
while(true) {
if(this.isInterrupted()) {
System.out.println("停止了!");
return;
}
System.out.println("timer" + System.currentTimeMillis());
}
}
}
public class ReturnMain { public static void main(String[] args) throws InterruptedException {
ReturnThread thread = new ReturnThread();
thread.start();
Thread.sleep(20);
thread.interrupt();
} }

在需要停止的地方return即可。

暂停线程所使用的suspend()和resume()已经弃用,这里看一下suspend()方法:

当某个线程的suspend()方法被调用时,该线程会被挂起。如果该线程占有了锁,则它不会释放锁。即,线程在挂起的状态下还持有锁。

public class MyThread extends Thread{
private long i = 0;
public void run() {
while(true) {
i++;
//syso是一个同步方法
System.out.println(i);
}
}
}
public class Main { public static void main(String[] args) {
try {
MyThread thread = new MyThread();
thread.start();//启动一个线程'thread'
Thread.sleep(1000);//使当前线程(main线程)睡眠
thread.suspend();//挂起线程'thread'
//下面这一行不会执行,因为println一直被占用
System.out.println("main end!");
} catch (InterruptedException e) {
e.printStackTrace();
}
} }

下面看一下println()源码:

    public void println(long x) {
synchronized (this) {
print(x);
newLine();
}
}

从上可以看出suspend()暂停线程之后不会释放锁。

而在main中调用resume(),可以恢复线程,线程执行完毕就会释放锁。

interrupted()和isInterrupted()比较+终止线程的正确方法+暂停线程的更多相关文章

  1. java多线线程停止正确方法

    //军队线程 //模拟作战双方的行为 public class ArmyRunnable implements Runnable { //volatile保证了线程可以正确的读取其他线程写入的值 // ...

  2. 零基础学习java------day18------properties集合,多线程(线程和进程,多线程的实现,线程中的方法,线程的声明周期,线程安全问题,wait/notify.notifyAll,死锁,线程池),

    1.Properties集合 1.1 概述: Properties类表示了一个持久的属性集.Properties可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字符串 一个属性列表可包含另 ...

  3. java线程interrupt、interrupted 、isInterrupted区别

    前言 在分析interrupt之前,应该先了解java里线程有5种状态,其中有一个阻塞状态,interrupt和阻塞有关. interrupt() 方法 作用于要中断的那个线程. interrupt( ...

  4. interrupt ,interrupted 和 isInterrupted

    1.interrupt  interrupt方法用于中断线程.调用该方法的线程的状态为将被置为"中断"状态. 注意:线程中断仅仅是置线程的中断状态位,不会停止线程.需要用户自己去监 ...

  5. java---interrupt、interrupted和isInterrupted的区别

    1.interrupt()  interrupt方法用于中断线程.调用该方法的线程的状态为将被置为"中断"状态. 注意:线程中断仅仅是置线程的中断状态位,不会停止线程.需要用户自己 ...

  6. Java并发编程之线程生命周期、守护线程、优先级、关闭和join、sleep、yield、interrupt

    Java并发编程中,其中一个难点是对线程生命周期的理解,和多种线程控制方法.线程沟通方法的灵活运用.这些方法和概念之间彼此联系紧密,共同构成了Java并发编程基石之一. Java线程的生命周期 Jav ...

  7. java线程相关基本方法

    java线程中常用的基本方法有wait,notify,notifyAll,sleep,join,yield等. 线程的生命周期一共分为五个部分,分别是:新建(New).就绪(Runnable).运行( ...

  8. 线程概念( 线程的特点,进程与线程的关系, 线程和python理论知识,线程的创建)

    参考博客: https://www.cnblogs.com/xiao987334176/p/9041318.html 线程概念的引入背景 进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运 ...

  9. python 全栈开发,Day41(线程概念,线程的特点,进程和线程的关系,线程和python 理论知识,线程的创建)

    昨日内容回顾 队列 队列 : 先进先出.数据进程安全 队列实现方式: 管道 + 锁 生产者消费者模型 : 解决数据供需不平衡 管道 双向通信 数据进程不安全 EOFError: 管道是由操作系统进行引 ...

随机推荐

  1. RT-thread内核之事件

    一.事件控制块:在include/rtdef.h中 #ifdef RT_USING_EVENT /** * flag defintions in event */ #define RT_EVENT_F ...

  2. RT-thread内核之空闲线程

    空闲线程是系统线程中一个比较特殊的线程,它具有最低的优先级,当系统中无其他线程可运行时,调度器将调度到空闲线程.空闲线程通常是一个死循环,永远不被挂起.RT-Thread实时操作系统为空闲线程提供了钩 ...

  3. P3808 【模板】AC自动机(简单版)

    题目背景 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 管理员提示:本题数据内有重复的单词,且重复单词应该计算多次, ...

  4. Python面向对象—类的继承

    一个子类可以继承父类的所有属性,不管是父类的数据属性还是方法. class Father(object): num = 0 def __init__(self): print "I'm Pa ...

  5. [Violet]蒲公英

    description 在线询问区间众数. data range \[n\le 40000,m\le 50000,a_i\le 10^9\] solution 自己分块不行于是\(\%\)了\(yyb ...

  6. SRM16 B-2(DP)

    老鼠和洞按坐标排序 f[i][j]表示前i个洞进j只老鼠的最短距离 比赛的时候强行分三类去推式子,推是推出来了,也看出来是可以用三个单调队列去优化的,但是太繁琐了,要我敲我真没办法T^T 赛后经 on ...

  7. Unity3D开发七惑

    使用Unity3D开发也有大半年了,心中存惑如下,愿与各位开发者一起探讨: (1)  远离普适编程之惑 随着游戏引擎的不断发展,游戏程序员的开发层级也越来越高,以unity3d尤为突出.如果是进行We ...

  8. bzoj 1218 [HNOI2003]激光炸弹 二维前缀和

    [HNOI2003]激光炸弹 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3022  Solved: 1382[Submit][Status][Di ...

  9. HDU1711 KMP(模板题)

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  10. [ASP.NET]从ASP.NET Postback机制,到POST/GET方法

    写这篇博客的起源来自于自己最近在学习ASP.NET时对于 PostBack机制的困惑.因为自己在解决困惑地同时,会不断产生新的疑问,因此博客最后深入到了http 包的格式和Internet所使用的TC ...