【多线程】——3.线程的中断


线程中断的概念

java线程中断是一种协作机制

通过中断并不能直接终止线程的运行

需要被中断的线程自己处理中断

(A通知B进行中断,B不会立刻中断,B会寻找合适的时机进行中断)

被中断的线程并不是立刻退出运行

每个线程都有一个boolean类型的标志位,代表线程是否被中断了。

线程1想要中断线程2,线程1设置线程2的标志位为true就可以了。

线程2在合适的时候处理该中断请求,甚至可以不处理中断请求。

线程中断的相关方法

1.public static boolean interrupted()

测试这个线程是否已经中断。但是调用这个方法,线程的中断状态也会被清除。

如果连续两次调用这个方法,第二次调用将返回false。除非两次调用之间当前线程又被中断一次。

2.public boolean isInterrupted()

测试这个线程是否已经中断。线程的中断状态不会被影响。

3.public void interrupt()

将调用该方法的对象所表示的线程标记一个停止标记,并不是真正的中断该线程。

public static void main(String[] args) {

    //当前线程

    Thread thread = Thread.currentThread();

    //当前线程是否被中断----【没有,false】

    System.out.println("1:"+thread.isInterrupted());

    //设置线程中断----【中断】

    thread.interrupt();

    //判断线程是否被中断----【被中断了,true】

    System.out.println("2:"+thread.isInterrupted());

    //判断线程是否被中断----【thread.isInterrupted() 没有改变线程中断标志位,还是true】

    System.out.println("3:"+thread.isInterrupted());

    try {

        //----【休眠2秒,但是线程被中断了,所以报错】

        Thread.sleep(2000);

        //----【不走这里,被catch了】

        System.out.println("not Interrupted");

    } catch (InterruptedException e) {

        //----【被catch后,程序运行到这里】

        System.out.println("Thread.sleep Interrupted");

        //判断线程是否被中断----【线程标志位变为false,代表线程没有被中断,意味着如果希望继续中断,要手工中断处理】

        System.out.println("4:"+thread.isInterrupted());

    }

    //----【标志位显示没有被中断】

    System.out.println("5:"+thread.isInterrupted());

}

返回结果

1:false

2:true

3:true

Thread.sleep Interrupted

4:false

5:false

interrupt()方法是唯一一个可以将线程中断状态设置为true的方法

静态方法interrupted()会将当前线程的中断状态清除。

中断的处理

1.方法声明中有抛出InterruptedEception则表示该方法是可以中断的

2.常见的抛出InterruptedEception异常的方法

Object.wait()

Thread.sleep()

BlockQueue.put()

BlockQueue.take()

抛出InterruptedEception

如果抛出InterruptedEception意味着一个方法是阻塞方法

那么调用一个阻塞方法意味着你的方法也是阻塞方法

通常最容易的策略就是自己抛出InterruptedEception

重新中断

有时候代码里面抛InterruptedEception不合适

Runnable接口的run()方法不允许抛出异常

如果线程运行中出现了InterruptedEception,又不能抛出异常

直接捕获异常可能又没办法通知上层代码,又不能保留中断证据

比较好的方式是再次调用interrupt()方法重新中断、

总结

1.子线程等待特定的条件到来后继续执行,如果特定条件提前到来,可以通过中断通知子线程

比如:Thread.sleep(10000)预计休眠10s,但是特定条件提前到来,通知sleep线程

2.线程调用join()阻塞自己子线程执行结束,子线程假设要耗时很久,没办法短时间内执行完,可以通过线程中断告诉主线程,我(子线程)要很久才能执行完,你(主线程)别等了。

3.线程中断只是一种协作机制,不能立马中断,被中断的线程在合适的时机才会被中断。

4.频繁的检测线程是否被中断,会导致效率很低下

5.较少的检查可能得不到及时的响应

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容