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(),返回的后果可能会不雷同