java - 如何正确地多线程独立任务的集合?

标签 java multithreading

我正在使用这段代码在不同的 CPU 内核之间分配数百个任务。

    final List<Throwable> errors = Collections.synchronizedList(Lists.<Throwable>newArrayList());

    final ExecutorService pool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

    for (...) {

        pool.execute(new Runnable() { @Override public void run() {

            try {

                // TASK HERE

            } catch (Throwable e) {
                errors.add(e);
            }

        }});

    }

    pool.shutdown();
    try {
        pool.awaitTermination(1000, TimeUnit.DAYS); // wait "indefinitely"
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }

    if (!errors.isEmpty()) throw Exceptions.wrap(errors.get(0)); // TODO multi-exception

它有效,但它并不好。

  • awaitTermination没有没有超时的版本,这就是我想要的。
  • 我需要自己收集错误。

执行此操作的正确/常用方法是什么?

最佳答案

线程池的重点是重用线程。您应该在应用程序启动时在创建任务的代码之外创建它,然后注入(inject)它。添加任务后无需关闭池。当您的应用程序关闭时,您会这样做。

要运行一组任务,请使用 ExecutorService.invokeAll。要在之后获得结果,请对每个返回的 Futures 调用 get。它会重新抛出任务抛出的任何异常,因此您可以在之后收集它。

关于java - 如何正确地多线程独立任务的集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11861634/

相关文章:

c++ - GDI+ 多线程绘图

java - 我可以获取不带 header 的 HttpServletRequest 请求正文吗?

java - AudioTrack - IllegalStateException : play() called on uninitialized AudioTrack

c# - 如何正确排队要在 C# 中运行的任务

java - 传递使用参数的android函数

c++ - 该程序使用 Visual Studio 编译,但 clang 和 gcc 无法编译

c++ - shared_ptr 和线程问题

java - Arduino Ping))) 传感器在显示一些结果后突然停止

java - 如何避免在 Java 中使用多个 if-else 语句进行验证

java - 根据单个用户输入填充和排序并行数组