【问题标题】:How to set timeout time for a task using ExecutorService in Java [duplicate]如何在Java中使用ExecutorService为任务设置超时时间[重复]
【发布时间】:2016-07-08 23:44:45
【问题描述】:

我有使用 ExecutorService 来安排任务的方法。我需要在一段时间后终止任务。如何指定这样的时间?

public String schedule(Callable<Object> task)
        {

            Future<Object> f = null;
            String status = null;
            try
            {
                f = service.submit(task);
                status = f.get(1, TimeUnit.SECONDS).toString();
            }
            catch (TimeoutException e)
            {
                status = "Waiting took too long.";
            }
            catch (Exception e)
            {
                 status = e.getMessage();
            }

            return f.toString();
        }

编辑: 我有一个进程应该在等待 x 时间以使资源可用后终止,而不是无限期地等待。

【问题讨论】:

标签: java executorservice timing java.util.concurrent threadpoolexecutor


【解决方案1】:

这个停止执行行为应该由任务本身来实现。您可以尝试强制停止线程,但这会导致死锁问题。

您应该让任务实现超时逻辑,以便它们可以以适当的方式自行关闭。


这是一个等待资源的任务的基本示例:

@Override
public Object call() throws Exception { // In a Callable<Object>
    long startTime = System.currentTimeMillis();
    while(System.currentTimeMillis() - startTime < 5000) { // wait for max 5 seconds.
        if(resource.isAvailable()) {
            // Do something with the resource
            return someValue;
        }
    }

    throw new TimeoutException("Resource could not be acquired");
}

【讨论】:

  • 谢谢,但我在这里谈论的是时间。 如何在执行器上设置时间间隔,之后它会终止线程。我有一个进程应该在等待 x 时间以使资源可用后终止,而不是无限期地等待。
  • @Nikk 我知道你想要什么,但使用执行器服务是不可能的,除非你可以打电话给shutdownNow()。终止线程,不是一个好主意。这不是一个可靠的机械师。这就是不推荐使用Thread 上的stop 方法的原因之一。您应该将终止委托给任务本身,以便它可以实现逻辑以适当的方式自行关闭。
  • 我明白了。那么在 Java 中使用什么技术来防止程序无限期地等待资源可用呢?
  • @nikk 最好的情况是,您附加一个侦听器,该侦听器会在资源可用时立即触发。除此之外,大多数资源都有办法检查它们是否可用(例如Future.isDone())。您将在 while 循环中轮询该检查,其中 while 循环条件是一个布尔值,您可以从另一个线程设置,以停止 while 循环并取消任务的执行。
  • 但是如果 resource.isAvailable() 从硬件端“阻塞”(确实如此),那么线程将永远不会从等待中返回。
猜你喜欢
  • 2011-02-15
  • 2017-04-27
  • 2021-03-28
  • 2023-04-08
  • 1970-01-01
  • 2015-01-03
  • 2015-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多