1.什么是线程中断?.如果当前线程的中断标志为真,是否应该立即停止?六、静态方法Thread.interrupted()介绍七、总结1、我们都知道什么是线程中断。JAVA很容易启动一个线程,线程结束后我们都停止了,但是我们会不会有这样一种情况,就是在线程运行到一半的时候,我们人为的停止了运行到一半的线程。这就是我们今天要说的,线程中断机制。点击Thread.java的源码,我们发现有stop、suspend(暂停)、resume(恢复)等方法,但是这些方法已经被弃用,所以不能使用。在现在的多线程编程中,一个线程不应该被其他线程强行中断或停止,而应该由线程自己停止,所以上面的方法都被弃用了。JAVA中没有办法立即停止一个线程,但是停止一个线程就显得尤为重要,比如取消一个非常耗时的操作,所以JAVA提供了一个停止线程的机制---中断。中断只是一种合作机制。JAVA没有给中断添加任何语法,中断的过程需要程序员自己实现。中断一个线程,需要手动调用线程的interrupt方法,这只是将线程对象的中断标志设置为true;那么就需要自己写代码不断检查当前线程的标志位,如果为真,则标记为标识的线程,要求中断该线程。这时候怎么办就需要自己写代码来实现了。每个线程对象都有一个标识符,用于标识线程是否被中断:标识符true表示中断,false表示不中断;通过调用线程对象的中断方法,将线程的标志位设置为true,可以在其他线程中调用,也可以在自己的线程中调用。2.中断相关API方法//实例方法interrupt()只是将线程的中断标志位设置为true,不会停止线程publicvoidinterrupt();//该方法做了两件事//1.返回线程的当前中断状态//2。设置当前线程的中断状态为truepublicstaticbooleaninterrupted();//判断当前线程是否中断publicbooleanisInterrupted()3.通过一个volatile变量实现线程中断publicclassInterruptDemo{//这是一个中断标记privatestaticvolatilebooleanisStop=false;publicstaticvoidmain(String[]args){//启动一个线程,一直循环。如果中断标志被其他线程更改为true,则停止该线程的执行newThread(()->{while(true){if(isStop){System.out.println(Thread.currentThread().getName()+"thread------isStop=true,自己退出");break;}System.out.println("--------hellointerrupt");}},"t1")。开始();//暂停线程几秒钟try{TimeUnit.SECONDS.sleep(1);}catch(InterruptedExceptione){e.printStackTrace();}isStop=true;}}4.通过Thread类自带的interruptapi方法实现publicclassInterruptDemo2{publicstaticvoidmain(String[]args)throwsInterruptedException{Threadt1=newThread(()->{while(true){System.out.println("Threadisrunning");if(Thread.currentThread().isInterrupted()){System.out.println("线程被中断isInterrupted:"+Thread.currentThread().isInterrupted());break;}}},"t1");t1.开始();//活动状态,t1线程还在执行try{TimeUnit.MILLISECONDS.sleep(3);}catch(InterruptedExceptione){e.printStackTrace();}//中断线程t1.interrupt();//让线程跳出循环程序try{TimeUnit.MILLISECONDS.sleep(3000);}catch(InterruptedExceptione){e.printStackTrace();}}}5.如果当前线程的中断标志为真,是否应该立即停止?从以上两个案例可以看出,中断只是一种协调机制,修改中断标志仅此而已,而不是中断科学停止6、静态方法Thread.interrupted()引入该方法,主要有两个作用:1)判断当前线程是否被中断,并返回该标志(即返回当前线程的中断状态)2)清除当前线程状态的中断publicstaticvoidmain(String[]args)throwsInterruptedException{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)中断只是一种协作机制,修改中断标志无非是立即停止2)手动调用线程的中断方法,该方法只是将线程对象的中断标志设置为true3)你需要自己写代码来不断检查当前线程的标志位。如果为真,则其他线程的标志要求本线程被中断。这时候你需要做的事情需要自己写代码来实现。4)连续两次调用interrupted(),返回的结果可能不同
