等待Executor中的所有线程完成?

Rei*_*ica 5 java parallel-processing quicksort executor

我正在实现一个parellel quicksort作为编程实践,在我完成后,我阅读了Executors上的Java教程页面,听起来他们可以让我的代码更快.不幸的是,我依靠join()来确保程序不会继续,直到所有内容都被排序.现在我正在使用:

public static void quicksort(double[] a, int left, int right) {
    if (right <= left) return;
    int i = partition(a, left, right);

    // threads is an AtomicInteger I'm using to make sure I don't
    // spawn a billion threads.
    if(threads.get() < 5){

        // ThreadSort's run method just calls quicksort()
        Future leftThread = e.submit(new ThreadSort(a, left, i-1));
        Future rightThread = e.submit(new ThreadSort(a, i+1, right));

        threads.getAndAdd(2);
        try {
            leftThread.get();
            rightThread.get();
        }
        catch (InterruptedException ex) {}
        catch (ExecutionException ex) {}
    }
    else{
        quicksort(a, left, i-1);
        quicksort(a, i+1, right);
    }
}
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常,但如果我在调用我的非递归quicksort()方法后立即运行e.shutdown(),它有一堆RejectedExecutionExceptions,所以我认为这不像我想要的那样好.

所以无论如何,我基本上试图获得与leftThread.join()相同的功能但是使用Executor,我的问题是:

这是等待所有线程完成的最好方法吗?

编辑:好的,所以我弄清楚为什么在关闭我的Executor后出现了一堆错误,这是因为我在循环中调用了这个函数(甚至运行时间)并且没有创建新的Executor.

Kev*_*Day 9

你使用什么类型的执行者?

ThreadPoolExecutor.awaitTermination() 会做你要问的事情(它实际上是一个批量连接操作).

总而言之,ThreadPoolExecutor将允许你设置线程数等的限制......(如果线程数很高,可能比你正在做的递归更好,不确定).

PS - 我怀疑执行程序会使代码运行得更快,但它们可能使代码更易于阅读和维护.使用线程池可以使这种算法更快,Executor使得使用线程池变得更容易.