java停止线程
本文将介绍jdk提供的api中停止线程的用法。
停止一个线程意味着在一个线程执行完任务之前放弃当前的操作,停止一个线程可以使用Thread.stop()方法,但是做好不要使用它,它是后继jdk版本中废弃的或者将不能使用的方法,大多数停止一个线程的操作使用Thread.interrupt()方法。
1.本实例将调用interrupt()方法来停止线程,创建MyThread.java,代码如下:
package com.lit.thread006;
public class MyThread extends Thread{
@Override
public void run() {
for(int i = 0 ; i < 500000; i++){
System.out.println("i= "+(i));
}
}
}
再创建Run1.java,代码如下:
package com.lit.thread006;
public class Run1 {
public static void main(String[] args) {
try {
MyThread thread = new MyThread() ;
thread.start();
Thread.sleep(1000);
thread.interrupt();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果如下:
i= 499992
i= 499993
i= 499994
i= 499995
i= 499996
i= 499997
i= 499998
i= 499999
程序在执行thread.interrupt()之后,线程并未停下来,而是继续执行直到打印了50万行记录才结束方法。显然,interrupt并没有停止线程。
Thread.java类提供了判断线程状态的方法:
(1)this.interrupted(): 测试当前的线程是否已经中断;
(2)this.isInterrupted():测试线程是否已经中断;
两个方法的区别是:第一个方法判断的是当前的线程,是一个静态的方法,第二个方式是判断调用的线程:
2.创建Run2.java,代码如下:
package com.lit.thread006;
public class Run2 {
public static void main(String[] args) {
try {
MyThread thread = new MyThread() ;
thread.start();
Thread.sleep(1000);
thread.interrupt();
System.out.println("1测试停止状态?"+thread.interrupted());
System.out.println("2测试停止状态?"+thread.interrupted());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果如下:
i= 195000
i= 195001
i= 195002
1测试停止状态?false
i= 195003
i= 195004
i= 195116
i= 195117
2测试停止状态?false
i= 195118
i= 195119
i= 195120
输出结果是两个false,因为当前线程是main,它从未停止。
3.创建Run3.java,代码如下:
package com.lit.thread006;
public class Run3 {
public static void main(String[] args) {
Thread.currentThread().interrupt();
System.out.println("1是否停止?"+Thread.interrupted());
System.out.println("2是否停止?"+Thread.interrupted());
}
}
运行结果如下:
1是否停止?true
2是否停止?false
可以看到第二个值是false,那是因为再调用了interrupted()方法之后,返回线程的中断状态,并且清除该状态。
4.继续看一下isInterrupted()方法,创建Run4.java,代码如下:
package com.lit.thread006;
public class Run4 {
public static void main(String[] args) {
try {
MyThread thread = new MyThread();
thread.start();
Thread.sleep(2000);
thread.interrupt();
System.out.println("是否停止1?"+thread.isInterrupted());
System.out.println("是否停止2?"+thread.isInterrupted());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果如下:
i= 405655
i= 405656
是否停止1?true
是否停止2?true
i= 405657
i= 405658
可以看到,isInterrupted()并未清除中断状态。
5.线程执行interrupt()之后停不下来只是做了一个停止标记,并不是真正的停止线程,那么如何停止一个线程呢?
创建StopThread.java类,代码如下:
package com.lit.thread006;
public class StopThread extends Thread{
@Override
public void run() {
try {
for(int i = 0 ; i < 500000 ; i++){
if(this.interrupted()){
System.out.println("线程已经是中断状态,线程退出!");
throw new InterruptedException();
}
System.out.println("i = "+(i+1));
}
} catch (InterruptedException e) {
System.out.println("进入了StopThread的catch代码块");
e.printStackTrace();
}
}
public static void main(String[] args) {
//测试
try {
StopThread thread = new StopThread() ;
thread.start();
Thread.sleep(1000);
thread.interrupt();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("method end");
}
}
运行结果如下:
i = 205738
i = 205739
i = 205740
i = 205741
method end
线程已经是中断状态,线程退出!
进入了StopThread的catch代码块
java.lang.InterruptedException
at com.lit.thread006.StopThread.run(StopThread.java:10)
通过抛出异常让线程停止。
此外还可以通过return关键字停止异常,也可以使用stop()方法停止异常,但要注意的是stop()方法并不推荐使用,因为stop()方法释放锁将会给数据造成不一致的结果,停止方式太暴力。
java停止线程的更多相关文章
- java线程之停止线程
在Java中有以下3种方法可以终止一个正在运行的线程: 1.使用退出标志,是线程正常退出,也就是run方法完成后线程终止. 2.使用stop方法强制终止线程,但不推荐使用 ...
- java使用线程请求訪问每次间隔10分钟连续5次,之后停止请求
java使用线程请求訪问每次间隔10分钟连续5次,收到对应的时候停止请求 package com.qlwb.business.util; /** * * * @类编号: * @类名称:RequestT ...
- JAVA之旅(十五)——多线程的生产者和消费者,停止线程,守护线程,线程的优先级,setPriority设置优先级,yield临时停止
JAVA之旅(十五)--多线程的生产者和消费者,停止线程,守护线程,线程的优先级,setPriority设置优先级,yield临时停止 我们接着多线程讲 一.生产者和消费者 什么是生产者和消费者?我们 ...
- java中线程的几种状态和停止线程的方法
1.线程的状态图 需要注意的是:线程调用start方法是使得线程到达就绪状态而不是运行状态 2.停止线程的两种方法 1)自然停止:线程体自然执行完毕 2)外部干涉:通过线程体标识 1.线程类中定义线程 ...
- Java如何停止线程?
在Java编程中,如何停止线程? 以下示例演示了如何通过创建一个用户定义的方法run()方法和Timer类来停止线程. package com.yiibai; import java.util.Tim ...
- java停止一个线程
Thread类中有start(), stop()方法,不过stop方法已经被废弃掉. 平时其实也有用过,共享一个变量,相当于标志,不断检查标志,判断是否退出线程 如果有阻塞,需要使用Thread的in ...
- java使用线程请求访问每次间隔10分钟连续5次,之后停止请求
java使用线程请求访问每次间隔10分钟连续5次,收到相应的时候停止请求 package com.qlwb.business.util; /** * * * @类编号: * @类名称:RequestT ...
- java以正确的方式停止线程
java线程停止可以说是非常有讲究的,看起来非常简单,但是也要做好一些防范措施,一般停止一个线程可以使用Thread.stop();来实现,但是最好不要用,因为他是不安全的. 大多数停止线程使用Thr ...
- java并发之停止线程
停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作.停止一个线程可以用Thread.stop()方法,但最好不要用它.虽然它确实可以停止一个正在运行的线程,但是这个方法是不安 ...
随机推荐
- Windows下ElasticSearch的使用方式 CURL+Cygwin+Head插件
Windows使用ElasticSearch的命令方法 一.CURL(不推荐) 下载curl安装包,解压到指定目录,在命令行运行解压后的exe文件. 二.Cygwin(推荐) 安装Windows下类l ...
- 转 DOS 8.3 文件名命名规则
http://www.360doc.com/content/10/0813/14/73007_45757514.shtml DOS 8.3 文件名命名规则 经常看到命令行或者其它软件在显示目录的时候出 ...
- hdu 5012 bfs 康托展开
Dice Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submi ...
- 结构字段验证--validator.v9
官网:https://godoc.org/gopkg.in/go-playground/validator.v9#hdr-Baked_In_Validators_and_Tags package va ...
- Spring Boot 2 快速教程:WebFlux 集成 Mongodb(四)
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 这是泥瓦匠的第104篇原创 文章工程:* JDK 1.8* M ...
- hdu5412CRB and Queries
动态修改求区间K大. 整体二分是一个神奇的东西: http://www.cnblogs.com/zig-zag/archive/2013/04/18/3027707.html 入门: 一般的主席树都挂 ...
- disruptor 核心链路应用场景
核心链路一般比较复杂并且需要考虑:服务之间相互依赖性.流程能够走完.人员的变动等情况 要考虑:兜底.补偿. 常见解决方案是:1)完全解耦 2)模板模式 其他解决方案:1)有限状态机框架:spring- ...
- NOIP前必须记住的30句话
NOIP前必须记住的30句话 1.比赛前一天晚上请准备好你的各种证件,事先查好去往考场的路线2.比赛之前请先调整你的屏幕分辨率到你喜欢的大小3.比赛之前请把编译器的字体调为你平时惯用的字体,尤其是注意 ...
- 将文件从已Root Android手机中copy出来的几个cmd窗口命令
将文件从已Root Android手机中copy出来的几个cmd窗口命令: 以shell身份登录adbadb shell进入adb后切换至root用户su更改文件的所属chown shell *更改文 ...
- Linux下Shell脚本运行程序不输出日志到终端
使用: 脚本路径/脚本名 >/dev/>& 说明: 可以简单的理解/dev/null是Linux下的回收站 >默认是把标准输出重定向 2>&1是把出错输出也定向 ...