2016-12-15 70 views
2

代码:的ExecutorService杀得螺纹

//List all threads: 
Set<Thread> runningThreads = Thread.getAllStackTraces().keySet(); 
System.out.println(runningThreads.toString()); 

//Thread creation: 
ExecutorService executorService = Executors.newSingleThreadExecutor(); 
executorService.execute(this); 

//Thread termination: 
executorService.shutdownNow(); 

//List all threads: 
Set<Thread> runningThreads = Thread.getAllStackTraces().keySet(); 
System.out.println(runningThreads.toString()); 

我期望被打印出来是完全一样的两个时间,但什么我得到是打印出来的线程所创建的列表包括在结果中

我该如何彻底销毁一个线程,以至于无处可寻?

+0

您应该等待关闭过程完成。线程可能尚未终止。 – glee8e

回答

1

shutdownNow()尝试停止正在运行的线程,但它的API文档说:

这种方法不会等待正在执行的任务终止。使用awaitTermination来做到这一点。

因此,当调用shutdownNow()后的代码返回时,线程仍可能正在运行。还要注意你需要确保线程中运行的任务实际上终止; shutdownNow()不会杀死线程,它只会尝试中断它。

正如文档所述,在调用shutdownNow()之后,请等待线程停止后再调用executorService.awaitTermination(...)

+0

如果它永远不会终止?看起来,即使我把'awaitTermination'放了几天,它就会挂起,永远不会杀死线程 – Hooli

+1

@Hooli:你永远不会显示你要提交给执行者的任务。如果它不响应中断而退出(消耗InterruptedException并持续循环或在I/O上阻塞),则它不会终止。 –

+0

@NathanHughes:把我的线程从while(true){...}改为while(!this.isInterrupted()){...}'是个好主意吗? – Hooli