我有这个scala
代码,可以很好地工作(run()
在类中被覆盖)
val processRunnable = new myProcessClassWithOverriddenRunFunction()
val processThread = new Thread(processRunnable)
processThread.start
我想做的是为processThread
线程设置超时。我该怎么办?
我做了一些研究,找不到可以传递给new Thread()
的任何参数或processThread
中的任何函数来实现这一目标。
在stackoveflow
上发现了一些解决方案,这些解决方案实现了{{1}每次调用此函数似乎效率低下。还有其他一些原因,但是我的问题是如何在此代码上实现该功能?
答案 0 :(得分:3)
没有线程的协作就无法实现这一目标。这本质上与如何创建线程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
}
}
}
PS。不要被基于ExecutorService
的{{3}}所误导-它要求线程是可中断的,即与上面所示的解决方案相同。
while (!Thread.interrupted()) {
// Process next chunk of work
}
答案 1 :(得分:1)
在Java中,您可以使用
CompletableFuture<Void> future = CompletableFuture.runAsync(processRunnable);
future.get(1000, TimeUnit.MILLISECONDS);
到future.get
函数将在达到超时(在上面的示例中为1秒)时抛出TimeOutException
,并且可以在catch块中处理超时情况。
完整的代码如下:
try {
CompletableFuture<Void> future = CompletableFuture.runAsync(processRunnable);
future.get(1000, TimeUnit.MILLISECONDS);
}
catch{
case texc : TimeoutException => println("Timeout is reached.")
case exc : Exception => println(exc.getmessage)
}