gpt4 book ai didi

java - 通过 ScheduledExecutorService 定期运行 Callable

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:58:02 24 4
gpt4 key购买 nike

我有一个 Callable<String> .我想通过 ScheduledExecutorService.scheduleAtFixedRate() 定期运行它,并获取 .call() 返回的所有字符串的列表对我的可调用对象的调用。作为scheduleAtFixedRate不需要 Callable (仅 Runnable s)我需要推出自定义 Runnable包裹着我的 Callable ,沿着这些线的东西:

final Callable<String> myCallable = ....;
final ConcurrentLinkedQueue<String> results
= new ConcurrentLinkedQueue<String>();

Runnable r = new Runnable() {
@Override public void run() {
try {
results.add(myCallable.call());
} catch (Exception e) {
results.add(null); // Assuming I want to know that an invocation failed
}
}
};

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(r, 0, 1, TimeUnit.SECONDS);

当然,我想避免推出我自己的自定义东西(尤其是在多线程代码中),所以我想知道是否有一个 JDK 类可以进行这种聚合?

最佳答案

您在上面所做的是将您的 Callable 实现视为另一个普通类。您没有将可调用项提交给 ThreadPool 执行程序。调用 Callable.call() 不使用 ThreadPoolExecutor。

您需要将任务(Runnable/Callable/ForkJoinTask 等)提交到 ThreadPool 以利用线程池。您可以使用 future 来收集执行后的结果。

ForkJoinPool 是您可以尝试的一个选项,它是 JDK 7 的一部分。使用 ForkJoinTask fork 任务并加入它们为什么不使用 future ?它们正是用于了解 Task 的状态及其结果。

你看过这个吗:Using Callable to Return Results From Runnables

关于java - 通过 ScheduledExecutorService 定期运行 Callable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13557612/

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