0

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

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

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

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

4

1 回答 1

0

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

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

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

除了尽最大努力停止处理正在执行的任务之外,没有任何保证。例如,典型的实现将通过 Thread.interrupt() 取消,因此任何未能响应中断的任务可能永远不会终止。

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

编辑

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

因此,仅当您有其他方法/线程组监视中断状态时才需要执行此操作。在你的情况下,可能不会,但它不会受到伤害。

2)似乎在“ShellUtils.executeCommand”中您正在运行外部程序。如果此方法对线程中断没有反应,这可能是问题的根源。

于 2015-01-26T18:31:33.617 回答