线程池内部分析(一)-interrupt、interrupted、isInterrupted

说起关于线程池文章,网上已经很多了,再次我也不介绍那么详细了。介绍线程池之前我们先看一下它内部几个方法

interrupt、interrupted和isInterrupted的区别

讲解之前希望先看一下这篇文章

https://blog.csdn.net/github_34889651/article/details/52474869

点击打开链接

文章的最后有个总结,我根据我意思稍微改一下

1. interrupted():是静态方法返回 当前线程 是否已经是中断状态,执行后具有清除状态功能。

2. isInterrupted():返回线程 Thread 对象 是否是中断状态。

作者用红字标示出来的需要特别注意,我 从源码上分析一下

public static boolean interrupted() {  
    return currentThread().isInterrupted(true);  
}
public boolean isInterrupted() {  
    return isInterrupted(false);  
} 

interrupted方法调用的currentThread()获取了当前的现成然后再调用isInterrupted()方法传入的参数为true

而inInterrupted传入的参数为false。

true和false表示是否清除中断状态。

接着我们看一下interrupt()、该方法是用于向当前调用者线程发出中断信号,这里需要说明一下:只是发生中断信号,并不能结束线程。且能被 wait() sleep() join()、队列take()、poll()等这几个方法捕捉到并产生中断,总之只要能抛出InterruptedException异常的都能中断,需要注意抛出上面的异常的时候,中断状态已被清除。就是当你调用interrupt后中断正在等待的线程,然后再catch中调用isInterrupted()会返回false。

注意:interrupt()在线程开启后马上执行,下次碰到堵塞也会抛出异常。代码如下

static boolean b =true;
try {
            MyThread12 thread = new MyThread12();
            thread.start();
            thread.interrupt();
            
            Thread.sleep(500);
            b =false;
    } catch (Exception e) {}
class MyThread12 extends Thread {
    public void run() {
    	try {
    		while(b){
    		    System.out.println("====");
    		}
    		System.out.println("-----");
    		bb.take();
    		System.out.println("======");
        } catch (InterruptedException e) {
            System.out.println("是否终止3? =" + currentThread().isInterrupted());
	}
    }

执行结果:

====
====
====
-----
是否终止3? =false

它们3个理解比较容易,就不举例子了,需要看例子的可以看一下下面的文章。

  点击打开链接
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值