我有以下代码
ExecutorService es = Executors.newSingleThreadExecutor();
es.submit(new Runnable() {
@Override public void run()
{
while(true);
}
});
es.shutdownNow();
问题是我调用shutdownNow后ExecutorService没有关闭。文档说它试图阻止所有正在执行的任务。
那么为什么ES无法关闭?
答案 0 :(得分:9)
我做到了这一点并且有效:
ExecutorService es = Executors.newSingleThreadExecutor();
es.submit(new Runnable() {
@Override public void run()
{
while(!Thread.currentThread().isInterrupted());
}
});
es.shutdownNow();
原因是shutdownNow
没有终止线程。它只会中断所有正在运行的线程。
答案 1 :(得分:1)
您无法关闭仅拒绝终止的线程。就像你在运行无限循环时强制终止线程一样。
来自shutdownNow()
的Javadoc:“除了尽力而为的尝试停止处理主动执行任务之外没有任何保证。例如,典型的实现将通过Thread.interrupt()取消,因此任何失败的任务响应中断可能永远不会终止。“
因此,除非你的线程响应一个中断(参见http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html),否则shutdownNow()
可以用来终止一个线程。
答案 2 :(得分:0)
文档中的关键词是“尝试”。
通过在循环中使用简单的while(true)
,您可以让线程无法被中断。
尝试在循环中调用sleep()
。
答案 3 :(得分:0)
isInterrupted()
才返回true。
ExecutorService es = Executors.newSingleThreadExecutor();
es.submit(new Runnable() {
@Override public void run()
{ // infinite loop to process
while(true)
{
// We've been interrupted: no more processing.
if(Thread.currentThread().isInterrupted()){
return;
}
}
}
});
es.shutdownNow();
答案 4 :(得分:-1)
请尝试这个
ExecutorService es = Executors.newSingleThreadExecutor();
es.submit(new Runnable() {
@Override public void run()
{
try{
while(true);
}catch(InterruptException){
Thread.currentThread().interrupt();
}
}
}); es.shutdownNow();