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

标签 java concurrency java.util.concurrent

我有一个从用户那里接收作业列表的调用,说用户发布了 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/

相关文章:

java - 如何在 Spring Boot @Async 中使用 ForkJoinPool?

java - ScheduledExecutorService 的 ThreadLocal

java - 如何以线程安全的方式访问可变对象列表

java - 如何使用 GWT 以编程方式在 CSS 类中设置宽度?

linux - 带线路缓冲的并发 UART 输出

go - 为什么runtime.Gosched有时不起作用?

java - 检查 ConcurrentHashMap 的 computeIfAbsent 是否改变了什么

java - 在 Spring AOP 中指定切入点

java - 如何从命令行将 VM 参数传递给 gradle?

c# - 使用 ConcurrentBag 的并行 ForEach 未按预期工作