java - 如何设置线程超时

标签 java multithreading scala

我有这个 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/

相关文章:

perl - 如何在 FreeBSD 7.1 下编译具有线程支持的 Perl 5.10?

sbt 上的 ScalaTest 没有运行任何测试

java - Java 图形的 2D 可视性( war 迷雾)

java - Axis2创建持久连接

java - 使用动态表达式查找具体类(其中将类实例传递给 DAO)

java - Java中线程安全的创建和删除文件

java - ServerSocket.accept() 是一种阻塞方法——多个监听器来加速?

java - 运行我的程序会导致 java.lang.NoSuchMethodError : scala. Predef$.augmentString(Ljava/lang/String;)Lscala/collection/immutable/StringOps;

scala - Spark UDAF 与 ArrayType 作为 bufferSchema 性能问题

java - 使用 Spring 和 Jetty 的 SSL