如何使用多线程处理java中的数据块?

时间:2018-02-28 17:30:47

标签: java multithreading

我正在处理一个需要以块的形式处理数据的任务。我有一个属性文件,我在其中定义块大小,假设500和我从数据库获得的数据是假设1000条记录。我想使用多线程处理每个块500个记录500个记录。

这是我第一次实现这一点,所以请告诉我是否可以使用其他技术实现相同目标。这背后的主要目的是我正在生成一个excel文件,我在其中填充数据,同时记住块大小。所以可能第一个线程处理500个记录,第二个线程接下来500个。

部分代码(Rest解析xml并使用POI在Excel中写入)

public List<NYProgramTO> getNYPPAData() throws Exception {
    this.getConfiguration();
    List<NYProgramTO> to = dao.getLatestNYData();
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    Document document = null;

    // Returns chunkSize
    List<NYProgramTO> myList = getNextChunk(to);
    ExecutorService executor = Executors.newFixedThreadPool(myList.size());
    myList.stream()
    .forEach((NYProgramTO nyTo) -> 
    {
        executor.execute(new NYExecutorThread(nyTo, migrationConfig , appContext, dao));
    });

    executor.shutdown();
    executor.awaitTermination(300, TimeUnit.SECONDS);
    System.gc();

dao.getLatestNYData();方法返回数据库中的记录总数,这就是我填充列表to的方式。

我有以下方法给了我下一组块,所以假设如果处理了500条记录,这个方法应该给下一条500条记录进行处理(希望这是有道理的)。

private static List<NYProgramTO> getNextChunk(List<NYProgramTO> list) {
    currentIndex = 0; // This is static int class variable 
    List<NYProgramTO> nyList = new ArrayList<>();

    if(list.size() == 0) {
        return list;
    }

    int totalCount = list.size();
    for(int i = currentIndex; i < (currentIndex + chunkSize); i++) {

        if(i == totalCount) break;
        nyList.add(list.get(i));
    }

    return nyList;
}

在我的第一个方法中,我现在在这里创建线程我不确定需要创建多少个线程。目前我正在通过getNextChunk();方法收到的列表大小。

NYExecutorThread这个类只是实现了Runnable,我还没有任何逻辑。目前,我只是在构造函数上传递参数,以便能够获取配置并创建线程。

这有点令人困惑,我想如果有人实施了这样的逻辑,请告诉我如何才能继续这样做?

由于

0 个答案:

没有答案