1.线程中断是什么

2.中断的相干API办法

3.通过一个volatile变量实现线程中断

4.通过Thread类自带的中断api办法实现

5.以后线程的中断标识为true,是不是就立即进行?

6.静态方法Thread.interrupted()介绍

7.总结

1.线程中断是什么
咱们都晓得,JAVA启动一个线程很容易,而且咱们都是通过线程完结之后才进行,然而咱们会不会有这样一种状况,那就是线程在运行到一半的时候,咱们人为地把这个运行到一半的线程给进行,这就是明天咱们要说的,线程中断机制。

点开Thread.java的源码,咱们发现是有stop,suspend(挂起),resume(复原) 等办法,然而这些办法都曾经被弃用了,所以不能应用。

在当初的多线程编程中,一个线程不应该由其它线程强制中断或者进行,而是应该由线程本人进行,所以下面几个办法被弃用了。

在JAVA中没有方法立刻进行一个线程,然而进行线程显得尤为重要,比方勾销一个十分耗时的操作,所以JAVA提供了一种进行线程的机制————中断

中断只是一种合作机制,JAVA没有给中断减少任何的语法,中断的过程齐全须要程序员本人实现。

若要中断一个线程,你须要手动调用该线程的interrupt办法,该办法也仅仅是将线程对象的中断标识设置成true;

接着你须要本人写代码一直检测以后线程的标示位,如果为true,标识别的线程要求这条线程中断,此时到底做什么须要你本人写代码实现

每个线程对象中都有一个标识,用于标识线程是否被中断:
该标识true示意中断,false示意未中断;

通过调用线程对象的interrupt办法将该线程的标示位设置为true,能够在别的线程中调用,也能够在本人的线程中调用。

2.中断的相干API办法

//实例办法interrupt()仅仅只是设置线程的中断标记位为true,不会进行线程public void interrupt();//这个办法做了两件事//1.返回以后线程的中断状态//2.将以后线程的中断状态设置为truepublic static boolean interrupted();//判断以后线程是否被中断public boolean isInterrupted()

3.通过一个volatile变量实现线程中断

public class InterruptDemo {    //这是一个中断的标记位    private static volatile boolean isStop = false;    public static void main(String[] args) {        //启动一个线程,始终进行循环,如果中断的标记位被其它线程改成了true,则进行线程的执行        new Thread(() -> {            while (true) {                if (isStop) {                    System.out.println(Thread.currentThread().getName() + "线程------isStop = true,本人退出了");                    break;                }                System.out.println("-------hello interrupt");            }        }, "t1").start();        //暂停几秒钟线程        try {            TimeUnit.SECONDS.sleep(1);        } catch (InterruptedException e) {            e.printStackTrace();        }        isStop = true;    }}

4.通过Thread类自带的中断api办法实现

public class InterruptDemo2 {    public static void main(String[] args) throws InterruptedException {        Thread t1 = new Thread(() -> {            while(true){                System.out.println("线程正在运行");                if(Thread.currentThread().isInterrupted()){                    System.out.println("线程被打断 isInterrupted: " + Thread.currentThread().isInterrupted());                    break;                }            }        }, "t1");        t1.start();        //活动状态,t1线程还在执行中        try {            TimeUnit.MILLISECONDS.sleep(3);        } catch (InterruptedException e) {            e.printStackTrace();        }        //打断线程        t1.interrupt();        //让线程跳出循环程序        try {            TimeUnit.MILLISECONDS.sleep(3000);        } catch (InterruptedException e) {            e.printStackTrace();        }    }}

5.以后线程的中断标识为true,是不是就立即进行?
从下面那两个案例中能够看出,中断只是一种协同机制,批改中断标识位仅此而已,而不是文科stop打断。

6.静态方法Thread.interrupted()介绍

这个办法,次要是有两个作用:
1)判断以后线程是否被中断,并返回这个标记位(就是返回以后线程的中断状态)
2)革除以后线程的中断状态

    public static void main(String[] args) throws InterruptedException {        System.out.println(Thread.currentThread().getName() + "---" + Thread.interrupted());        System.out.println(Thread.currentThread().getName() + "---" + Thread.interrupted());        System.out.println("111111");        Thread.currentThread().interrupt();        System.out.println("222222");        System.out.println(Thread.currentThread().getName() + "---" + Thread.interrupted());        System.out.println(Thread.currentThread().getName() + "---" + Thread.interrupted());    }

返回后果为:

能够看出,

还没有调用interrupt()办法的时候:
调用interrupted()返回的以后线程中断状态都是false(未被中断)。

调用了interrupt()办法之后:
第一次调用interrupted(),返回以后的中断状态为(true),并且革除了以后线程的中断状态,从true改为false。
第二次调用interrupted(),返回以后的中断状态为(false),因为以后线程的中断状态为false,所以状态不扭转。

7.总结

1)中断只是一种协同机制,批改中断标识位仅此而已,不是立即stop打断
2)手动调用该线程的interrupt办法,该办法也仅仅是将线程对象的中断标识设置成true
3)须要本人写代码一直检测以后线程的标示位,如果为true,标识别的线程要求这条线程中断,此时到底做什么须要你本人写代码实现。
4)间断调用两次interrupted(),返回的后果可能会不雷同