我想使用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()
函数(当然,在更新相关字段后),但它似乎不起作用。
答案 0 :(得分:0)
我认为你没有使用正确的方法。 Fork / Join框架旨在对(可能)大数据集执行长时间运行算法,以并行方式将数据拆分为更小的块(RecursiveTask
本身),而不是由更多线程执行(加速)使用工作窃取策略在多个“cpu”机器上执行。
RecursiveTask
不需要复制您的所有数据,只是为了保留您正在处理的部分的索引(以避免有害的重叠),因此数据开销保持在最低限度(当然,每个{ {1}}也消耗内存)。
在算法设计中,内存占用和执行时间之间经常存在关联,因此FJ框架旨在减少执行支付(我认为相当小的)内存占用的时间。如果执行时间不是您首先关注的问题,我认为FJ对您的问题毫无用处。