最近在系统回顾多线程这一部分的内容,对线程中断方式这一部分相比之前有了不同的认识。整理一下,如有理解偏颇之处,还请各位大神不惜赐教。

    在看高洪岩《Java多线程编程核心技术》的时候里面讲了很多种停止线程方式,其实仔细回想起来停止线程并没有那么复杂。总体整理下来就三种方式!1、正常退出;2、stop暴力停止(不再推荐使用);3、异常法;

1、正常退出

当线程中run()或者call()按照逻辑流程正常的执行结束了,线程也就自然停止了。

2、stop暴力停止

直接在程序中使用thread.stop(),线程会马上停止,但是可能导致数据不同步,或者资源得不到回收的问题而且stop已经标注为作废方法,所以使用一定要慎重。

3、interrupt()异常法。

   小编以前的博客写过《【多线程】——停止线程的三种方式》其中讲的是interrupt()和在沉睡中停止本质上讲这两种方式都是通过异常停止的,而且讲的不是很全面,应该是只要线程处于阻塞状态配合interrupt()都能使线程停止,而且停止的方式都是通过抛异常。

    interrupt()方法仅仅是在当前线程中打了一个停止的标识将中断标志修改为true,并没有真正的停止线程。如果在此基础上进入堵塞状态(sleep(),wait(),join()),马上就会抛出一个InterruptedException,且中断标志被清除,重新设置为false,线程退出。所以退出线程的方式不仅仅是sleep()+interrupt()方法,其它的暂停线程的方式都可以。

package com.jia.thread;

/**
* @author 贾文静 on 2018/6/6.
* Describe
*/
public class InterruptService implements Runnable {
//如果使用Callable接口中call方法异常就会得以扩散
@Override
public void run() {
try {
System.out.println( "begin run" );
//重要:无论是先中断还是先阻塞都能达到停止线程的目的,只要两者配置使用就可以到达效果
Thread.currentThread().interrupt();
//方式一,线程进入sleep
// Thread.sleep( 10 );
//方式二、join
// Thread.currentThread().join();
//方式三、wait
// Thread.currentThread().wait();
System.out.println( "begin end" );
} catch (Exception e) {
System.out.println("先interrupt再阻塞后终止了");
e.printStackTrace();
}
}
}
package com.jia.thread;

/**
* @author 贾文静 on 2018/6/6.
* Describe
*/
public class SleepThread {
public static void main(String[] args) throws InterruptedException {
try {
InterruptService interruptService = new InterruptService();
Thread thread = new Thread(interruptService);
thread.start();
Thread.sleep(2000);
} catch (Exception e) {
e.printStackTrace();
}
}
}

interrupt简述

    interrupt()方法只是改变中断状态,不会中断一个正在运行的线程。需要用户自己去监视线程的状态为并做处理。支持线程中断的方法(也就是线程中断后会抛出interruptedException的方法)就是在监视线程的中断状态,一旦线程的中断状态被置为“中断状态”,就会抛出中断异常。这一方法实际完成的是,给受阻塞的线程发出一个中断信号,这样受阻线程检查到中断标识,就得以退出阻塞的状态。 

    更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,此时调用该线程的interrupt()方法,那么该线程将抛出一个 InterruptedException中断异常(该线程必须事先预备好处理此异常),从而提早地终结被阻塞状态。如果线程没有被阻塞,这时调用 interrupt()将不起作用,直到执行到wait(),sleep(),join()时,才马上会抛出 InterruptedException。

this.interrupted()

    测试当前线程是否已经中断(静态方法)。返回的是上一次的中断状态,并且会清除该状态,所以连续调用两次,第一次返回true,第二次返回false。

this.isInterrupted()

    测试线程当前是否已经中断,但是不能清除状态标识。

总结

    再次总结线程的停止方式,将线程停止方式归纳一下,就三种方式,理解清楚了其实也不是很复杂。