在某些情况下可以使用 Thread.suspend() 吗?

Posted

技术标签:

【中文标题】在某些情况下可以使用 Thread.suspend() 吗?【英文标题】:Is it ok to use Thread.suspend() under certain conditions? 【发布时间】: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?)

【问题讨论】:

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

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

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

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

引用 javadocs:

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

【讨论】:

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

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

【讨论】:

嗯,这需要向测试类添加注释。我的测试用例在编译时是未知的......

以上是关于在某些情况下可以使用 Thread.suspend() 吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥要放弃使用Thread.Sleep

System.Threading.Thread.Sleep(2000);啥意思,啥用

如何唤醒一个处于阻塞状态下的线程

c# .net 一条线程 abort 之后,怎么重启启动。

Thread专题 - 取消和关闭

在某些情况下,ADO 组件,尤其是 TADOCommand,是不是可以更可靠地使用未命名或命名参数?