我执行一个平行的快速排序,作为编程的做法,并在我完成之后,我读Java教程页面上的执行人,这声音就像他们可以使我的代码甚至更快。不幸的是,我依赖join()'s到确保程序不会继续,直到一切都是排序。现在我是使用:

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);
    }
}

这似乎是工作确定,但如果我跑e。关闭()右后,我请我的非递归的快速排序()方法,它有一堆RejectedExecutionExceptions,所以我认为这不是工作以及为我想要的。

所以无论如何,我基本上是试图获得相同的功能leftThread.join()但与一个遗嘱执行人,和我的问题是:

这是最好的方法等待,直到所有的线是做什么?

编辑:好了,我知道为什么我有一大堆的错误之后关闭我的遗嘱执行人,这是因为我是这个叫功能在一个循环(甚至出运行的时间),而不是创造一个新的执行者。

有帮助吗?

解决方案

什么类型的执行您使用的是?

ThreadPoolExecutor .awaitTermination()将你所问的有关(这是有效的批量连接操作)。

作为整体一边,ThreadPoolExecutor的将允许你在线程等的#设限...(可能是更好的比去递归喜欢自己正在做什么,如果线程数变高,不知道)。

PS - 我怀疑遗嘱执行人将会使你的代码跑得更快,但它们可能使你的代码更容易阅读和维护。使用线程池会使事情这个排序算法的速度更快,执行人可以很容易地工作,线程池。

其他提示

看看 Executors.newFixedThreadPool 其中,您可以创建一个水池在最n线(摆脱了你的"如果")和 ExecutorService.shutdown 方法和 ExecutorsService.awaitTermination 法。

您可以使用 CountDownLatch

  

PS - 我怀疑遗嘱执行人将会使你的代码运行得更快,但   他们可以使你的代码更容易阅读和维护。使用线程   池将会使事情更快这种算法,以及   执行程序可以很容易地与工作线程池。

这是不正确的。

在执行程序可以是“备份”由任意数量的不同的执行系统,包括池线程。

您需要正确地调用工厂类。

此外,你还需要一个政策决定,涉及以作业提交到队列的速度比他们可以食用的情况下,因为你可能的的最初的记忆由于对限用完线程执行,但如果你排队数百万就业机会,那么他们必须同时他们等待执行存储一些地方。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top