测试套件完成后,为什么我的线程不会退出?

时间:2015-01-26 17:06:11

标签: java multithreading threadpool jsch worker-thread

我创建了一个自动化测试套件,它在所有测试用例的后台同时运行一个线程池,以获得给定的系统和性能指标。每个线程都使用JSch连接来执行它的shell命令,并且它们正在接收[JSchException:Channel not opened exception]。

关键问题是测试套件继续永远运行,因为即使所有测试用例都已结束,线程也不会退出。但我不确定为什么......

当我检查线程转储时,我发现线程没有退出,因为它们处于BLOCKED状态。

有人对此有解释吗?或者帮助解决这个问题?

1 个答案:

答案 0 :(得分:0)

我猜你的意思是ExecutorService的shutdownNow()方法。这是文档(我用粗体格式化了相关部分):

  

尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。

     

此方法不会等待主动执行终止任务。使用awaitTermination来做到这一点。

     

除了尽力尝试停止处理主动执行任务之外,没有任何保证。例如,典型的实现将通过Thread.interrupt()取消,因此任何无法响应中断的任务都可能永远不会终止。

线程中断是一个协作过程,必须实现您的线程以便它们响应中断。

修改

1)关于Thread.currentThread.interrupt()看到这个问题:Why invoke Thread.currentThread.interrupt() when catch any InterruptException?

所以只有当其他方法/线程组正在观察中断状态时才需要这样做。在你的情况下,可能不是,但它没有伤害。

2)似乎在" ShellUtils.executeCommand"你正在运行外部程序。如果此方法不对线程中断作出反应,则可能是问题的根源。