Java 8 Java8中的Fork-Join框架是最佳选择吗?

Java 8 Java8中的Fork-Join框架是最佳选择吗?,java-8,executorservice,fork-join,Java 8,Executorservice,Fork Join,我有一个场景,比如我想读一个由大约2000条记录组成的电子表格,然后把它输入数据库 目前我们正在使用Executor框架。我们有一个限制,任务的数量不能只有5个。每个任务从excel中读取20行。我们提供从excel读取到每个任务的行的开始索引和结束索引 比如说,目前, 任务1处理1-20个任务 任务2处理21-40个任务 任务3处理41-60 任务4处理61-80 任务5处理81-100 如果Task-1完成了它的执行,它将占用接下来的20行,即101-120行。假设Task-2在Task-1

我有一个场景,比如我想读一个由大约2000条记录组成的电子表格,然后把它输入数据库

目前我们正在使用Executor框架。我们有一个限制,任务的数量不能只有5个。每个任务从excel中读取20行。我们提供从excel读取到每个任务的行的开始索引和结束索引

比如说,目前,
任务1处理1-20个任务
任务2处理21-40个任务
任务3处理41-60
任务4处理61-80
任务5处理81-100

如果Task-1完成了它的执行,它将占用接下来的20行,即101-120行。
假设Task-2在Task-1之前完成,它将从121-140而不是101-120开始读取。

我是否可以在Fork-Join框架中更有效地处理这种情况,只限制5个任务,每个任务20行


需要深入了解性能问题。

无需切换线程池。要使负载更加平衡,只需维护指向第一个未执行行的原子变量:

AtomicInteger currentRow = new AtomicInteger(); // shared between tasks
final int maxRow = 2000;
final int batchSize = 20;

// Inside every task:
while(true) {
    int row = currentRow.getAndAdd(batchSize);
    if(row >= maxRow) return;
    int from = row+1;
    int to = Math.min(row+batchSize, maxRow);
    // process rows from..to; it's guaranteed that other threads
    // do not process the same rows.
}

每项任务的主体都是完全相同的。此外,此实现不依赖于创建的任务数。如果以后决定使用3个任务或7个任务,只需调整线程池大小并提交更多(或更少)任务。

无需切换线程池。要使负载更加平衡,只需维护指向第一个未执行行的原子变量:

AtomicInteger currentRow = new AtomicInteger(); // shared between tasks
final int maxRow = 2000;
final int batchSize = 20;

// Inside every task:
while(true) {
    int row = currentRow.getAndAdd(batchSize);
    if(row >= maxRow) return;
    int from = row+1;
    int to = Math.min(row+batchSize, maxRow);
    // process rows from..to; it's guaranteed that other threads
    // do not process the same rows.
}

每项任务的主体都是完全相同的。此外,此实现不依赖于创建的任务数。如果您以后决定使用3个任务或7个任务,只需调整线程池大小并提交更多(或更少)任务。

我看不出有任何理由更改框架。现在,任务的处理,现在是由我们设计的代码完成的,即,如果任务1已结束,则分配下一个任务是由自定义代码完成的。fork-join框架本身是否有任何有效的处理方法?我们还插入了一个延迟,等待所有任务完成后才能得到结果。fork-join框架自己处理这个问题吗?我看不出有任何理由改变框架。现在,任务的处理,现在是由我们设计的代码完成的,也就是说,如果任务1结束,分配下一个任务是由自定义代码完成的。fork-join框架本身是否有任何有效的处理方法?我们还插入了一个延迟,等待所有任务完成后才能得到结果。fork-join框架自己处理这个问题吗?目前,这个框架用于从db读取数据并写入google电子表格。问题是当我们编写时,第一个任务从数据库中提取100行,根据自定义逻辑过滤数据,并将结果行单独写入电子表格。因此,对于要开始编写的第二个任务,我们需要等到第一个任务完成后才能知道第二个任务应该从哪一行开始编写。因此,我想知道fork-join框架是否能够自行处理这种情况。工作窃取算法在Fork-join中是如何工作的?目前,该框架用于从db读取数据并写入google电子表格。问题是当我们编写时,第一个任务从数据库中提取100行,根据自定义逻辑过滤数据,并将结果行单独写入电子表格。因此,对于要开始编写的第二个任务,我们需要等到第一个任务完成后才能知道第二个任务应该从哪一行开始编写。因此,我想知道fork-join框架是否能够自行处理这种情况。工作窃取算法如何在Fork-join中工作?