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. 域对象 pageContext request session servletContext

    pageContext 当前页面之内有效 request   当前的请求内有效 session 当前的会话内有效 servletContext 当前这次服务器生命周期内有效

  2. 【转】C# 利用反射动态创建对象

    http://www.cnblogs.com/Jan_Dai/archive/2010/11/09/1872812.html Activator.CreateInstance(Type.GetType ...

  3. BZOJ4196:[NOI2015]软件包管理器——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=4196 https://www.luogu.org/problemnew/show/P2146 你决定 ...

  4. ContestHunter暑假欢乐赛 SRM 02

    惨不忍睹 3个小时都干了些什么... 日常按顺序从A题开始(难度居然又不是递增的 第一眼A题就觉得很简单...写到一半才发现woc那是个环.感觉一下子复杂了,按照链的方法扩展的话要特判很多东西... ...

  5. beego入门小坑

    刚接触beego,按照官网的文档操作,始终发现在orm操作数据的时候提示表不存在,数据库连接设置都没问题 "0 Error 1146: Table 'beego.archives' does ...

  6. phantomjs 无法打开https网站

    最近一直在用phantomjs 自动登陆并爬取一些数据,突然发现爬取https类型的网站的时候无法正常操作了 困扰了两天的问题在经过google和stackoverflow的一番搜索后发现原来Phan ...

  7. oracle xml操作

      /*=====================生成\修改xml========================= */ --xmlelement多个标签层级 SELECT XMLELEMENT(& ...

  8. Java中的String为什么是不可变的? — String源码分析

    原文地址:http://www.importnew.com/16817.html 什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为 ...

  9. android中dip、dp、px、sp和屏幕密度

    1. dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA 推荐使用这    这个 ...

  10. generatorConfiguration配置文件及其详细解读

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE generatorConfiguratio ...