gpt4 book ai didi

java - 如何在单独的线程中运行任务特定的时间并返回结果?

转载 作者:行者123 更新时间:2023-12-01 19:01:48 26 4
gpt4 key购买 nike

如何让线程运行指定的时间并在时间过去时返回一些结果?

到目前为止我能想到的最好的解决方案是手动测量时间。但也许有更优雅、开箱即用的解决方案?

我有一个算法,在每次迭代中都会改进以前的解决方案。我想在一个单独的线程中运行这段代码预定的时间。当时间过去时,应返回最佳(最新)解决方案。

由于我想返回解决方案,所以我不能只使用 Future#get(long timeout, TimeUnit unit) - 这会导致TimeoutException。在“控制”线程一段时间后中断线程也是如此 - 在这种情况下,Future 将被取消并返回 null

我目前的解决方案如下:

定时器逻辑:

private class ExecutionTimer {

private final long executionTimeLimit;

private long startTime;

// accepts execution time limit in _miliseconds_
public ExecutionTimer(final int executionTimeLimit) {
this.executionTimeLimit = TimeUnit.MILLISECONDS.toNanos(executionTimeLimit);
}

public void start() {
this.startTime = System.nanoTime();
}

public boolean hasElapsed() {
return (System.nanoTime() - startTime) >= executionTimeLimit;
}
}

...和工作线程:

 private class WorkerThread implements Callable<Double> {

private final ExecutionTimer executionTimer;

public WorkerThread(final int executionTimeLimit) {
this.executionTimer = new ExecutionTimer(executionTimeLimit);
}

@Override
public Double call() throws Exception {
executionTimer.start();

double partialSolution = 0;
while (!executionTimer.hasElapsed()) {
// let's imagine that here solution is improved ;)
partialSolution = new Random().nextDouble();
}
return partialSolution;
}
}

编辑:工作线程可以无限期地工作,而不会从外部中断它 - 这很好,因为算法总是可以改进以前的解决方案(当然,经过一些显着的时间改进相对较小)

最佳答案

您可以将中间结果存储在共享线程安全变量中(例如,在您的情况下,volatile double) - 当您的 future 超时时,您可以从该变量检索最新的计算值。

换句话说:

  • 如果 future.get(...) 返回一个值,则使用它
  • 如果出现 TimeoutException,请通过调用 yourWorkerThread.getLatestValue(); 检索该值,该方法返回一个 volatile 双最新值,即在每个循环中更新,而不是本地 partialSolution

或者,this post指向 Guava 库和其他解决方案(这一切都归结为我的评论中讨论的 2 个选项)。请注意Guava, internally ,使用带有超时的 future。

关于java - 如何在单独的线程中运行任务特定的时间并返回结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12020909/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com