java以正确的方式停止线程
java线程停止可以说是非常有讲究的,看起来非常简单,但是也要做好一些防范措施,一般停止一个线程可以使用Thread.stop();来实现,但是最好不要用,因为他是不安全的。
大多数停止线程使用Thread.interrupt()方法,但是这个方法不会终止一个线程,还需要加入一个判断才可以完成线程的停止。
下面介绍一下常用停止线程应该使用的方法:
1、interrupt()
Thread.interrupt()方法仅仅设置线程的状态位为中断线程,并不是让线程马上停止,中断线程之后会抛出interruptException异常。
2、Thread.interrupted()
测试当前线程是否已经是中断状态,并且清楚状态。Boolean类型,中断返回true,反之false。当前线程指的是当前方法,并不是启动当前方法的线程。而清楚状态,则是指如果调用两次interrupted()方法,则第二次返回false。
3、Thread.isInterrupted()
测试线程是否已经是是中断状态,但是不清除状态标志。
其实上面的开始我也不理解,经过多次思考,我用自己的话总结一下吧。
1、interrupt()方法仅仅将线程设置为中断状态,但是并不会去停止线程,返回true说明线程的中断状态已经被设置了。
2、
interrupt()、interrupted()和isInterrupted()的具体使用:
interrupt()、interrupted()使用:
public class Test01 extends Thread {
@Override
synchronized public void run() {
super.run();
for (int i = 0; i < 100000; i++) {
//判断线程是否停止
if (this.interrupted()){
System.out.println("已经停止了");
break;
}
System.out.println(i);
}
System.out.println("虽然线程已经停止了,但是还是会跳出for循环继续向下执行的");
}
public static void main(String[] args) {
Test01 test = new Test01();
try {
test.start();
test.sleep(50);
//线程停止
test.interrupt();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println();
}
}
打印结果:
3707
3708
3709
3710
3711 已经停止了
虽然线程已经停止了,但是还是会跳出for循环继续向下执行的
使用异常捕获法停止多线程:
当interrupted()检测到线程状态为停止的时候,会抛出异常,继而捕获这个异常来停止多线程
/**
* 使用异常捕获法停止多线程
*/
public class Test01 extends Thread { @Override
synchronized public void run() {
super.run();
try {
for (int i = 0; i < 100000; i++) {
//判断线程是否停止
if (this.interrupted()) {
System.out.println("已经停止了");
//抛出异常
throw new InterruptedException();
}
System.out.println(i);
}
} catch (InterruptedException e) {
System.out.println("线程结束...");
}
} public static void main(String[] args) {
Test01 test = new Test01();
try {
test.start();
test.sleep(100);
test.interrupt();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(); } }
打印语句:
8219
8220
8221
8222
8223
8224 已经停止了
线程结束...
java以正确的方式停止线程的更多相关文章
- C#语法——泛型的多种应用 C#语法——await与async的正确打开方式 C#线程安全使用(五) C#语法——元组类型 好好耕耘 redis和memcached的区别
C#语法——泛型的多种应用 本篇文章主要介绍泛型的应用. 泛型是.NET Framework 2.0 版类库就已经提供的语法,主要用于提高代码的可重用性.类型安全性和效率. 泛型的定义 下面定义了 ...
- Java 学习笔记之 Stop停止线程
Stop停止线程: 使用stop()方法停止线程是非常暴力的,会抛出java.lang.ThreadDeath Error,但是我们无需显示捕捉, 以下捕捉只是为了看得更清晰. public clas ...
- Java多线程(五)停止线程 在沉睡中停止线程
在沉睡中停止线程会抛出异常 public class SleepInterruptDemo extends Thread { public void run() { super.run(); try ...
- Java多线程(五)停止线程 interrupt
调用interrupt方法仅仅是在当前线程中打了一个停止的标记,并不是真正停止线程. this.interrupted() :测试当前线程是否已经中断,执行后具有将状态标志清除为false的功能 is ...
- Java 学习笔记之 Return停止线程
Return停止线程: 使用interrupt()和return结合也可以实现停止线程的效果.不过还是建议使用“抛异常“的方法,因为在catch块中可以将异常向上抛,使线程停止的事件得以传播. pub ...
- Java 学习笔记之 Sleep停止线程
Sleep停止线程: 在Sleep状态下被interrupt,interrupted 状态会被擦除,返回false. 线程在Sleep状态下被interrupt: public class Sleep ...
- (Java多线程系列四)停止线程
停止线程 停止线程的思路 ①使用退出标志,使线程正常退出,也就是当run()方法结束后线程终止. class Thread01 extends Thread { // volatile关键字解决线程的 ...
- Java如何停止线程?
在Java编程中,如何停止线程? 以下示例演示了如何通过创建一个用户定义的方法run()方法和Timer类来停止线程. package com.yiibai; import java.util.Tim ...
- 正确停止线程的方式三 使用Thread类中的内置的中断标记位-----------不熟悉
package charpter10; public class Processor implements Runnable { @Override public void run() { for ( ...
随机推荐
- 2 cmd中startup显示运行不了显示“不是内部或外部命令”
解决方案: 1 在C:\Windows\System32中检查cmd.exe是否存在(如果存在的话)(检查cmd.exe是否被误删) 2 在我的电脑——属性——环境变量——在系统变量找到Path编辑前 ...
- 学习笔记:SVG和Canvas
SVG SVG 与 Flash 类似,都是用于二维矢量图形,二者的区别在于,SVG 是一个 W3C 标准,基于 XML,是开放的.因为是 W3C 标准,SVG 与其他的 W3C 标准,比如 CSS.D ...
- php编译安装过程中遇到问题
编译安装PHP时遇到的问题 问题1: configure: error: xml2-config not found. Please check your libxml2 installation. ...
- POJ 1631 Bridging signals(LIS的等价表述)
把左边固定,看右边,要求线不相交,编号满足单调性,其实是LIS的等价表述. (如果编号是乱的也可以把它有序化就像Uva 10635 Prince and Princess那样 O(nlogn) #in ...
- 进入Windows之前发出警告
实现效果: 知识运用: 通过注册表中HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\子键下的LegalNoticeCaption ...
- python_29_三级菜单
menu={ '北京':{ '海淀':{ '五道口':{ '搜狐':{}, '网易':{}, 'Google':{}, }, '中关村':{ '爱奇艺':{}, '汽车之家':{}, '优酷':{}, ...
- OO终章
一,第四单元架构设计 第一次作业:只有类图 1,重置MyClass,MyOperation等类,为使里面只有必要数据(name,id,visibility等).或方便组织数据(如MyClass作为其底 ...
- 解决Jquery中使用each循环时,循环外的js依旧会执行
今天在改项目bug时,发现一个问题,我获取一个div中所有的input,并取值时,判断某一条件,但是循环外的js依然可以执行. $(".tab-reg-next input").e ...
- 六、Linux 文件基本属性
Linux 文件基本属性 Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限.为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规 ...
- 二十五、MySQL 索引
MySQL 索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索 ...