【问题标题】:Reusing task objects in fork/join in Java 7在 Java 7 的 fork/join 中重用任务对象
【发布时间】:2012-11-14 11:16:50
【问题描述】:

我想使用 Java fork join 来解决递归问题,但我不想为每个递归步骤显式创建一个新任务实例。原因是太多的任务等于太多的对象,在处理几分钟后就填满了我的记忆。

我在 Java 6 中有以下解决方案,但是 Java 7 有更好的实现吗?

final static AtomicInteger max = new AtomicInteger(10);  // max parallel tasks
final static ThreadPoolExecutor executor = new ThreadPoolExecutor(....);

private void submitNewTask() {
    if (max.decrementAndGet()>=0) {
        executor.execute(new Task(....));
        return;
    }
    run();  // avoid creating a new object
}

public void run() {
    ..... process ....
    // do the recursion by calling submitNewTask()
    max.incrementAndGet();
}

我尝试在同一任务上再次调用invoke() 函数(当然是在更新相关字段之后),但它似乎不起作用。

【问题讨论】:

  • 你所做的与 Fork/Join 有什么关系?递归分解的整个想法是将一个大数组分解成更小的部分,以便每个部分都可以在不同的处理器上运行。这些部分称为任务。我们需要更多信息。

标签: scalability java-7 fork-join


【解决方案1】:

我认为您没有使用正确的方法。 Fork/Join 框架旨在以并行方式在(可能)大数据集上执行长时间运行的算法,将数据分成更小的部分(RecursiveTask 本身),而不是由更多线程执行(加速执行在多台“cpu”机器上)使用工作窃取策略。

RecursiveTask 不需要复制所有数据,而只是为了在您正在处理的部分保留索引(以避免有害的重叠),因此数据开销保持在最低限度(当然,每个 RecursiveTask也消耗内存)。

在算法设计中,内存占用和执行时间之间通常存在一个线程,因此 FJ 框架旨在减少执行时间,支付(我认为相当少的)内存占用。如果执行时间不是您首先关心的问题,我认为 FJ 对您的问题毫无用处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-04
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 2011-05-15
    • 2015-10-13
    • 1970-01-01
    相关资源
    最近更新 更多