在Java 7中重用fork / join中的任务对象

时间:2012-11-14 11:16:51

标签: scalability java-7 fork-join

我想使用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()函数(当然,在更新相关字段后),但它似乎不起作用。

1 个答案:

答案 0 :(得分:0)

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

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

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