并发编程(三)—— 线程中断与线程上下文切换

一、线程中断

        线程中断是一种线程间的协作模式,本质上并不能终止该线程的执行,而逝被中断的线程根据中断状态自行处理:

        (1)void interrupt():中断线程

        (2)boolean isInterrupted():检测当前线程是否被中断,若被中断,返回true,否则返回false;

        (3)boolean interrupted():检测当前线程是否被中断,若被中断,返回true,否则返回false。

interrupted()与isInterrupted() 不同的是,interrupted是static方法,可以通过Thread类直接调用。interrupted会清除中断标志,而isInterrupted只会返回,并不会清除中断标志,源码如下:

图 1-1 interrupted与isInterrupted

            使用demo如下:

图 1-2 使用样例

         运行结果:

图 1-3 运行结果

        如果在中断一个阻塞状态的线程会怎样?上代码:

图 1-4 中断阻塞状态的线程

        运行结果:

图 1-5 运行结果

        结论:可以发现中断一个正在sleep阻塞的线程时,该阻塞线程会被唤醒,并抛出一个InterruptedException。也就是在应用程序中,不用必须等到sleep的休眠时间,可以根据需要,通过interrut方法提前唤醒该线程。

二、线程上下文切换

        CPU资源的分配采用时间片轮转的策略,也就是给每个线程分配一个时间片,线程在时间片内占用CPU执行任务,当前线程使用完时间片后,就会处于就绪状态并让出CPU让其他线程占用。

        一个线程让出CPU使用权的,就是“切出”;另一个线程获取到CPU的使用权,即“切入”;在切出过程中,系统会保存当前线程执行的信息,以便于切入时,能恢复到正确的地方继续进行。

        线程上下文切换的时机有:

        (1)当前线程的CPU时间片使用完;

        (2)当前线程被其他线程中断;

        (3)当前线程主动让出CPU资源,放弃时间片剩余时间。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容