C语言 c++ php mysql nginx linux lnmp lamp lanmp memcache redis 面试 笔记 ppt 设计模式 问题 远程连接

线程中断

 

中断api

//返回线程状态位状态
public boolean isInterrupted()

//设置线程中断状态位为true
public void interrupt()

//返回线程中断状态,并清除中断状态
public static boolean interrupted()

 

不同状态的中断效果

1、NEW和TERMINATED

NEW:还未启动,start
TERMINATED:线程运行结束
效果:并不会设置线程的中断标识位,什么事也不会发生。

2、RUNNABLE

运行状态,不一定所有处于RUNNABLE状态的线程都能获得CPU运行,没有获得cpu时间片的没有真正在运行
效果:只是设置中断状态位,不会让线程实际中断,需要程序自己去判断(增加程序灵活性)。

public void run(){
    while(true){
        //判断线程是否被中断了
        if (Thread.currentThread().isInterrupted()){
            System.out.println("exit MyThread");
            break;
        }
    }
}

 

3、BLOCKED

该状态说明该线程由于竞争某个锁失败被挂在了阻塞队列上
效果:只是设置中断状态位,不会让线程实际中断

 

4、WAITING和TIMED_WAITING

WAITING:无期限等待知道notify
TIMED_WAITING:等待指定时间
线程运行中由于缺少某个条件而被挂起在某个对象的条件队列上
效果:会抛出一个InterruptedException异常,并清空中断标志位

 

总结

NEW和TERMINATED对于中断操作几乎是屏蔽的
RUNNABLE和BLOCKED类似,对于中断操作只是设置中断标志位并没有强制终止线程,对于线程的终止权利依然在程序手中。
WAITING/TIMED_WAITING状态下的线程对于中断操作是敏感的,他们会抛出异常并清空中断标志位。

 

 

参考:https://www.cnblogs.com/yangming1996/p/7612653.html

 

posted on 2019-08-17 16:17  思齐_  阅读(305)  评论(0编辑  收藏  举报