如何设置线程超时

时间:2018-11-05 12:01:43

标签: java multithreading scala

我有这个scala代码,可以很好地工作(run()在类中被覆盖)

val processRunnable = new myProcessClassWithOverriddenRunFunction()
val processThread = new Thread(processRunnable)
processThread.start

我想做的是为processThread线程设置超时。我该怎么办?

我做了一些研究,找不到可以传递给new Thread()的任何参数或processThread中的任何函数来实现这一目标。

stackoveflow上发现了一些解决方案,这些解决方案实现了{{1}每次调用此函数似乎效率低下。还有其他一些原因,但是我的问题是如何在此代码上实现该功能?

2 个答案:

答案 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)
}