gpt4 book ai didi

java - 为什么我的 threadExecutor 调用同一个回调两次?

转载 作者:行者123 更新时间:2023-11-29 05:12:57 26 4
gpt4 key购买 nike

我有这个代码:

public <T> T executeCodeBlockWithTimeLimit(String criticalBlockTimeOutMilli, Callable<T> callable) throws
Exception {
ExecutorService service = Executors.newSingleThreadExecutor();
Future<T> future = service.submit(callable);

startStopWatch();
T result;

if (criticalBlockTimeOutMilli != null) {
result = future.get(Long.parseLong(criticalBlockTimeOutMilli), TimeUnit.MILLISECONDS);
} else {
result = callable.call();
}
long timeElapsed = stopStopWatch();
e2eResult.runTime = timeElapsed;
service.shutdown();
return result;
}

在外部方法中:

    Callable<Void> callable = new
Callable<Void>() {
@Override
public Void call() throws
Exception {

System.out.println("22222");

return null;
}
};
timerUtils.executeCodeBlockWithTimeLimit(criticalBlockTimeOutMilli, callable);

我看到了控制台打印

22222
22222

为什么要调用两次?

最佳答案

当您从 Executor 获得 Futuresubmit方法 这个调用 Callable 对象方法并存储结果。在您的代码中,您首先获得 Future 然后如果变量 criticalBlockTimeOutMilli<b>null</b>你调用call() Callable 对象上的方法。这意味着执行两次 Callable 对象。

您应该使用 get()方法,因为这个方法使用已经从您的 Future 对象收集的结果(参见 Future#get() method )。

关于java - 为什么我的 threadExecutor 调用同一个回调两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27676700/

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