【问题标题】:Polling Multiple Threads and CPU Usage轮询多个线程和 CPU 使用率
【发布时间】:2011-08-21 16:07:34
【问题描述】:

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

目前我有一个大的 while 循环,它会检查并休眠 50 毫秒,这很有效,但我想知道我是否有更好的方法可以在没有任何睡眠的情况下执行此操作,我尝试休眠 0 毫秒 AFAIK 这让我的线程到 cpu que 结束,但它仍然使用了太多的 cpu,大约 60%。

【问题讨论】:

    标签: java concurrency java.util.concurrent


    【解决方案1】:

    这听起来像是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(包装执行抛出的异常)。任何一个都会立即发生(感谢执行者完成服务)。

    然后你会做出相应的反应:如果f.get()抛出异常,从futures集合中移除f,遍历集合的其他元素(也就是遍历你提交的其他任务),然后@ 987654330@他们。 Callables 必须编码为可取消,否则对 .cancel() 的调用将无济于事。

    【讨论】:

      【解决方案2】:

      您可以将 A、B、C 作业包装在 Runnable 中,该 Runnable 知道作业何时失败并且还知道控制线程。当此包装器检测到作业失败(异常、运行时条件等)时,它将通知控制线程以采取进一步行动。

      这样您就不必轮询线程,但您将等待来自包装错误检测器的信号。

      【讨论】:

        【解决方案3】:

        您可以为作业添加回调,在线程失败的情况下调用该回调。然后回调将继续停止所有线程。

        【讨论】:

        • 但是我仍然需要等待我需要在所有成功时向用户返回一个真/假值如果一个失败为假则为真。
        猜你喜欢
        • 2012-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多