gpt4 book ai didi

java - 轮询多个线程和 CPU 使用率

转载 作者:行者123 更新时间:2023-11-29 06:10:20 27 4
gpt4 key购买 nike

我有一个从用户那里接收作业列表的调用,说用户发布了 3 个作业 A、B 和 C,它们都在自己的线程 AT、BT 和 CT 中开始执行,然后我开始监视这 3 个线程,如果其中一项工作失败说 B 失败,我需要向 A 和 C 发出停止信号。当所有线程停止时返回,当一个失败时全部成功返回true。

目前我有一个很大的 while 循环,它会检查并 hibernate 50 毫秒,这很有效,但我想知道我有没有任何 sleep 的更好方法来做到这一点,我尝试 hibernate 0 毫秒 AFAIK 这让我的线程到 cpu que 的末尾,但它仍然使用了太多的 cpu,大约 60%。

最佳答案

这听起来像是 ExecutorCompletionService 的用例

// wrap tasks A, B and C into runnables (or callables if you need some result):
Callable<Result> taskA = ...;
Callable<Result> taskB = ...;
Callable<Result> taskC = ...;

// create an ExecutorCompletionService
// to which you must pass an ExecutorService
// (choose one according to your precise use case)
// (the newCachedThreadPoolExecutor might not be a sensible choice)
ExecutorCompletionService e = new ExecutorCompletionService(Executors.newCachedThreadPoolExecutor());

Set<Future<Result>> futures = new HashSet<>();

// submit your tasks:
futures.add(e.submit(taskA));
futures.add(e.submit(taskB));
futures.add(e.submit(taskC));

// now call take() on the executor completion service,
// which will block the calling thread until the first task has completed
// either succesfully or abruptly (with an exception)
Future<Result> f = e.take();

在此之后,当您调用 f.get() 时,您将获得 Result 的一个实例,或者它会抛出一个 ExectutionException (包装执行抛出的异常)。任何一个都会立即发生(感谢执行者完成服务)。

然后你会做出相应的 react :如果 f.get() 抛出异常,从 futures 集合中移除 f,遍历该集合的其他元素(即通过您提交的其他任务),以及 .cancel() 它们。 Callable 必须编码为可取消,否则调用 .cancel() 将不会执行任何操作。

关于java - 轮询多个线程和 CPU 使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7139408/

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