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.将以后线程的中断状态设置为true
public 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(),返回的后果可能会不雷同
发表回复