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

时间:2016-02-12 10:12:52

标签: 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之前完成,它将从121-140而不是101-120开始读取。 />

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

需要深入了解性能问题。

1 个答案:

答案 0 :(得分:3)

无需切换线程池。为了使负载更加平衡,您可以只维护原子变量,该变量指向第一个未采用的行:

CREATE PROCEDURE [dbo].[updatestuff]
    @update1 AS udtupdate1 READONLY ,
    @update2 AS udtupdate2 READONLY ,
    @time DATETIME
AS 
    BEGIN       

    SET NOCOUNT ON        

-- uses udtupdate1      
        UPDATE  lms  
        SET     lms.col1 = lsp.col1 ,  
                lms.TimeStamp = @time 
        FROM    dbo.tlivetable1 lms  
                INNER JOIN @update1 lsp ON lms.livetable1Id = lsp.colId    


        UPDATE  ms
        SET     ms.col1 = lsp.col1 ,
                ms.TimeStamp = @time
        FROM    dbo.tmrks ms
                INNER JOIN @update1  lsp ON ms.mrksId = lsp.Colid    

-- uses udtupdate2

        UPDATE  mms
        SET     mms.col2 = msp.col2 ,
                mms.Date = @time
        FROM    dbo.tMMSel mms
                INNER JOIN @update2 msp ON msp.col1Id = mms.MMId
                AND msp.col2Id = mms.MMSId

END    

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