java - 提交并等待 ExecutorService 终止的正确方法

标签 java multithreading threadpool executorservice

我正在使用 ExecutorService 学习如何在 Java 中使用线程池,这是我正在处理的示例:

public class Example {
    static class WorkerThread implements Runnable {
        private String command;

        public WorkerThread(String s) {
            this.command = s;
        }

        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() + " Start. Command = " + command);
            processCommand();
            System.out.println(Thread.currentThread().getName() + " End.");
        }

        private void processCommand() {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        @Override
        public String toString() {
            return this.command;
        }
    }

    public static void main(String[] args) throws InterruptedException {
        ExecutorService executor = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 10; i++) {
            Runnable worker = new WorkerThread("" + i);
            executor.execute(worker);
        }
        executor.shutdown();
        executor.awaitTermination(1, TimeUnit.SECONDS);
//        while (!executor.isTerminated()) {
//        }
        System.out.println("Finished all threads");
    }
}

我有两个问题:

  1. 我应该如何等待 ExecutorService 的终止? , 我应该使用 awaitTermination()isTerminated() (有人提出后者是错误的做法)?

  2. Runnable s 已正确添加到执行程序中,或者我应该使用 submit()连同 Future<T>回调?

这可能取决于上下文,所以请您解释(对于这两个问题)我应该在什么时候使用提到的每个解决方案。

最佳答案

实现它的几种方法: (a) 在 while (!executor.isTerminated()) 内调用 awaitTermination(long someTime, TimeUnit ....)。 (b) 将所有可调用对象存储在 Collection 对象中并调用 executor.invokeAll(....)。这将等到执行程序服务完成所有任务。

关于java - 提交并等待 ExecutorService 终止的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35324022/

相关文章:

c# - 如何从不同的线程更新命令的 "CanExecute"值?

java - 使用 Xstream 定义 XML 结构

java - Android 安装应用程序对话框

java - Impala 通过 jdbc 使元数据失效

java - ThreadPoolExecutor 和 Socket。线程未启动

C# - 何时在高事件服务器中使用标准线程、ThreadPool 和 TPL

java - 如何在 playframework 2 中构建模块

c# - LINQ : Sequence contains no elements 错误

python - 如何中断 python 中的阻塞方法?

c++ - 长时间运行的 std::async 会饿死其他 std::async 吗?