在某些条件下使用Thread.suspend()是否可以?

时间:2013-04-15 20:30:00

标签: java multithreading unit-testing junit abort

我想在java程序中运行jUnit测试用例,并在超时后停止运行。要执行测试,我使用JUnitCore的run(Request)方法。

测试类包含花费大量时间和/或不终止的方法。因此,我希望能够停止执行。

但是,jUnit的pleaseStop标志仅在完成测试用例后才被考虑,方法不能被中断,并且内容(例如,可以关闭的已使用的IO资源)是未知的。此外,我想避免使用一个过程。

还有其他方法可以阻止执行单个测试用例吗?

在我不在线程之间共享任何资源的条件下使用Thread.suspend()是否可以?

(我读过  Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?

2 个答案:

答案 0 :(得分:2)

  

在我不在线程之间共享任何资源的条件下使用Thread.suspend()是否可以?

我会说,对于 tests ,使用已弃用的Thread.suspend()方法应该没问题。我认为重申它被弃用的原因很重要。您可以在持有锁时暂停线程,这可能会极大地改变代码的运行方式,甚至导致死锁。

如果可能的话,我会考虑使用其他机制来实现相同的行为。

引用javadocs:

  

已过时。此方法已被弃用,因为它本身就容易出现死锁。如果目标线程在监视器上保持锁定,在挂起时保护关键系统资源,则在恢复目标线程之前,任何线程都无法访问此资源。如果恢复目标线程的线程在调用resume之前尝试锁定此监视器,则会导致死锁。这种死锁通常表现为“冻结”过程。有关更多信息,请参阅为什么Thread.stop,Thread.suspend和Thread.resume已弃用?。

答案 1 :(得分:1)

您可以对单个测试使用timeout参数,也可以对类中的所有测试使用Timeout规则。请参阅此处的文档Timeout-for-tests