【问题标题】:Is it ok to use Thread.suspend() under certain conditions?在某些情况下可以使用 Thread.suspend() 吗?
【发布时间】:2013-04-15 20:29:59
【问题描述】:

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

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

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

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

在线程间不共享资源的情况下使用Thread.suspend()可以吗

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

【问题讨论】:

  • 对于测试,挂起线程应该没问题,只要它不是因为竞争条件而导致测试失败的关键任务。
  • 你能改进你测试的代码吗?如果您可以更改它以使其不会“挂起”,并且当资源不可用或阻塞时它会自行运行(即在您的代码中添加超时),您会更好。生产中的挂起流程会发生什么?还可以考虑为在无限循环中处理的任何线程添加“取消”方法。
  • 不,程序的目的是运行变异测试,测试用例不能修改/未知。

标签: java multithreading unit-testing junit abort


【解决方案1】:

在线程间不共享资源的情况下使用Thread.suspend()可以吗?

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

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

引用 javadocs:

已弃用。此方法已被弃用,因为它本质上容易死锁。如果目标线程在暂停时对保护关键系统资源的监视器持有锁,则在目标线程恢复之前,没有线程可以访问该资源。如果将恢复目标线程的线程在调用 resume 之前尝试锁定此监视器,则会导致死锁。这种死锁通常表现为“冻结”进程。有关详细信息,请参阅为什么不推荐使用 Thread.stop、Thread.suspend 和 Thread.resume?。

【讨论】:

  • 您对“测试没问题”是什么意思?这样的程序必须正常工作且可靠。
  • 我的假设是否正确,我不会因为线程之间不存在共享对象而导致任何死锁?
  • 我试图区分在实时代码中使用它还是在 Junit 中使用它。只要您了解限制@nrainer,使用这些方法就可以进行测试。
  • 如果线程进入任何synchronized 块或锁定任何锁,那么即使@nrainer 没有共享对象,您也可能会遇到问题。
  • 我不确定我是否理解。线程将持有锁,但它是锁定对象的独占用户。因此,没有其他线程会遇到问题。对吗?
【解决方案2】:

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

【讨论】:

  • 嗯,这需要向测试类添加注释。我的测试用例在编译时是未知的......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-02
  • 2013-05-21
  • 1970-01-01
相关资源
最近更新 更多