1

我想使用 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()再次在同一任务上调用该函数(当然是在更新相关字段之后),但它似乎不起作用。

4

1 回答 1

0

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

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

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

于 2013-01-27T08:34:29.390 回答