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以正确的方式停止线程的更多相关文章

  1. C#语法——泛型的多种应用 C#语法——await与async的正确打开方式 C#线程安全使用(五) C#语法——元组类型 好好耕耘 redis和memcached的区别

    C#语法——泛型的多种应用   本篇文章主要介绍泛型的应用. 泛型是.NET Framework 2.0 版类库就已经提供的语法,主要用于提高代码的可重用性.类型安全性和效率. 泛型的定义 下面定义了 ...

  2. Java 学习笔记之 Stop停止线程

    Stop停止线程: 使用stop()方法停止线程是非常暴力的,会抛出java.lang.ThreadDeath Error,但是我们无需显示捕捉, 以下捕捉只是为了看得更清晰. public clas ...

  3. Java多线程(五)停止线程 在沉睡中停止线程

    在沉睡中停止线程会抛出异常 public class SleepInterruptDemo extends Thread { public void run() { super.run(); try ...

  4. Java多线程(五)停止线程 interrupt

    调用interrupt方法仅仅是在当前线程中打了一个停止的标记,并不是真正停止线程. this.interrupted() :测试当前线程是否已经中断,执行后具有将状态标志清除为false的功能 is ...

  5. Java 学习笔记之 Return停止线程

    Return停止线程: 使用interrupt()和return结合也可以实现停止线程的效果.不过还是建议使用“抛异常“的方法,因为在catch块中可以将异常向上抛,使线程停止的事件得以传播. pub ...

  6. Java 学习笔记之 Sleep停止线程

    Sleep停止线程: 在Sleep状态下被interrupt,interrupted 状态会被擦除,返回false. 线程在Sleep状态下被interrupt: public class Sleep ...

  7. (Java多线程系列四)停止线程

    停止线程 停止线程的思路 ①使用退出标志,使线程正常退出,也就是当run()方法结束后线程终止. class Thread01 extends Thread { // volatile关键字解决线程的 ...

  8. Java如何停止线程?

    在Java编程中,如何停止线程? 以下示例演示了如何通过创建一个用户定义的方法run()方法和Timer类来停止线程. package com.yiibai; import java.util.Tim ...

  9. 正确停止线程的方式三 使用Thread类中的内置的中断标记位-----------不熟悉

    package charpter10; public class Processor implements Runnable { @Override public void run() { for ( ...

随机推荐

  1. angular 学习笔记(2) ng-repeat遍历json

    视图: <div ng-app="myApp" ng-controller="myCtrl"> <ul> <li ng-repea ...

  2. GridView的 PreRender事件与范例--GridView + CheckBox,点选多列资料(复选删除)

    GridView的 PreRender事件与范例--GridView + CheckBox,点选多列资料(复选删除) 之前有一个范例,相同的结果可以用两种作法来实践 [GridView] 资料系结表达 ...

  3. 平时对ES6的一些总结

    1.Genertor中yield和Interator中的next方法 Genertor的yield是把这个函数变成分段的:Interator中的next也是一个一个执行的: function* f() ...

  4. openstack RuntimeError: Unable to create a new session key. It is likely that the cache

    [Mon Apr 15 01:02:31.654247 2019] [:error] [pid 19433:tid 139790082479872] Login successful for user ...

  5. World Wind Java开发之十——AnalyticSurface栅格渲染(转)

    http://blog.csdn.net/giser_whu/article/details/43017881 1.AnalyticSurfaceDemo ArcGIS下对栅格的各种分级渲染效果是非常 ...

  6. 扫描局域网ip的shell

    # vim /mysh/ipscan.sh #!/bin/bash # scan the local alive ipaddress # -- if [ -f $filename ];then ech ...

  7. 修改android studio中的avd sdk路径、avd sdk找不到的解决方案

    要进行Android应用程序的开发,首先就要搭建好Android的开发环境,所需要的工具有如下4个:1.java JDK:2.Android SDK:3.Eclipse:4.ADT 1.java JD ...

  8. c#树形结构

    http://download.csdn.net/detail/rememberme001/6997235 http://bbs.csdn.net/topics/310094150 http://ww ...

  9. Bootstrap历练实例:简单的可折叠

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  10. question 002: dev c++ 当中如何调整字体大小?How to get the first program with C++? c++属于什么软件?

    方法:按住ctrl+鼠标滑轮滚动 c++属于系统软件还是应用软件? 说哪个都不对,编译之前属于应用软件,after compile ,it belongs to system software. #i ...