感谢你无私的奉献,让我了解到为什么不用不用stop(),推荐的标志的方式。
我也想再问一句:为什么不使用sleep()呢。
1.我可以在方法中捕捉InterruptedException 时候 处理异常并且用ruturn;
2.我看到官方自带的线程池Exceutor中的shutdownNow也是使用 interrupte()的如下:
java.util.concurrent.ThreadPoolExecutor中的
private void interruptWorkers() {
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try {
for (Worker w : workers) {
try {
w.thread.interrupt();
} catch (SecurityException ignore) {
}
}
} finally {
mainLock.unlock();
}
}
我看到网上是说 interrupte()不能中断IO。
问题还是回到interrupte()方法的初衷,这个方法是用来向线程发出中断请求,而非停止线程的。当然很多时候要停止线程就需要先给他一个中断请求,然后让线程处理中断(比如处理InterruptedException)。
在你提到的shutdownNow中,我们看到调用interruptWorkers()也是这个意思,让所有的worker线程有机会处理中断。紧接着,tryTerminate()回去做停止的工作。
public List<Runnable> shutdownNow() {
List<Runnable> tasks;
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try {
checkShutdownAccess();
advanceRunState(STOP);
interruptWorkers();
tasks = drainQueue();
} finally {
mainLock.unlock();
}
tryTerminate();
return tasks;
}