说起关于线程池文章,网上已经很多了,再次我也不介绍那么详细了。介绍线程池之前我们先看一下它内部几个方法
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个理解比较容易,就不举例子了,需要看例子的可以看一下下面的文章。
点击打开链接