我有这个 scala
代码,它工作得很好(run()
在类中被覆盖)
val processRunnable = new myProcessClassWithOverriddenRunFunction()
val processThread = new Thread(processRunnable)
processThread.start
我想做的是为 processThread
线程设置一个超时。我该怎么做?
我做了一些研究,但找不到我们可以传递给 new Thread()
或 processThread
中的任何函数来实现该目的的任何参数。
在 stackoveflow
上找到了一些实现了 ExecutorService
的解决方案,但不幸的是,这在这个特定问题中是不可实现的,因为要为另一个新的 ExecutorService
只有一个processThread
,每次调用这个函数都显得效率低下。还有一些其他原因,但我的问题是如何在此代码上实现该功能?
最佳答案
如果没有线程协作,就无法实现这一点。这在本质上类似于如何制作线程 interruptible ,并且与一般情况下的事实有关unsafe停止异步运行线程(并且超时是异步的)。
您的线程需要将超时功能作为其实现的一部分,以便它可以在安全的情况下对超时条件采取行动。
例如:
public class MyProcessClass {
private final long timeoutMillis = 30000;
public void run() {
long timeout = System.currentTimeMillis() + timeoutMillis;
while (System.currentTimeMillis() < timeout) {
// Process next chunk of work
}
}
}
附言。不要被other answer误导了基于 ExecutorService
- 它要求线程是可中断的,即与上面所示的解决方案相同。
while (!Thread.interrupted()) {
// Process next chunk of work
}
关于java - 如何设置线程超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53154029/