一、线程中断
线程中断是一种线程间的协作模式,本质上并不能终止该线程的执行,而逝被中断的线程根据中断状态自行处理:
(1)void interrupt():中断线程
(2)boolean isInterrupted():检测当前线程是否被中断,若被中断,返回true,否则返回false;
(3)boolean interrupted():检测当前线程是否被中断,若被中断,返回true,否则返回false。
interrupted()与isInterrupted() 不同的是,interrupted是static方法,可以通过Thread类直接调用。interrupted会清除中断标志,而isInterrupted只会返回,并不会清除中断标志,源码如下:
使用demo如下:
运行结果:
如果在中断一个阻塞状态的线程会怎样?上代码:
运行结果:
结论:可以发现中断一个正在sleep阻塞的线程时,该阻塞线程会被唤醒,并抛出一个InterruptedException。也就是在应用程序中,不用必须等到sleep的休眠时间,可以根据需要,通过interrut方法提前唤醒该线程。
二、线程上下文切换
CPU资源的分配采用时间片轮转的策略,也就是给每个线程分配一个时间片,线程在时间片内占用CPU执行任务,当前线程使用完时间片后,就会处于就绪状态并让出CPU让其他线程占用。
一个线程让出CPU使用权的,就是“切出”;另一个线程获取到CPU的使用权,即“切入”;在切出过程中,系统会保存当前线程执行的信息,以便于切入时,能恢复到正确的地方继续进行。
线程上下文切换的时机有:
(1)当前线程的CPU时间片使用完;
(2)当前线程被其他线程中断;
(3)当前线程主动让出CPU资源,放弃时间片剩余时间。