Java Executor Framework执行多线程任务的有效方法

时间:2018-07-30 04:23:19

标签: java multithreading

我有一个场景,其中现有代码执行以下任务(单个Java文件和类):

methodCopyDataBasedOnDates(StartDate, EndDate) {
    GetDataFromSomewhere(); // Gets data from a Database table
    ProcessData(); //Converts to JSON array
    PasteSomewhereElse(); //Copies to Amazon S3
}

现在,由于这需要很长时间才能完成单个任务,因此我想实现Java多线程作为解决方案。 我打算像这样使用executorFramework:

LinkedBlockingQueue<whatever> allDateRangesQueue; //Contains all date ranges.
    ExecutorService executorService = Executors.newFixedThreadPool(20);

while(!allDateRangesQueue.empty())
    {
               executorService.execute(new Runnable() {
                    @Override
                    public void run()

            // DatePair consists of start date and end date pair. Eg: if input date range is one year, then this DS consists of date ranges of 1 day each 364 entries in the Queue for the threads to pick up.
                        final HashMap<Integer, String> datePair = allDateRangesQueue.poll(); 
                        methodCopyDataBasedOnDates(date.get(0), date.get(1), threadName);
                    }

                });
    }

问题:就模块性和效率而言,我需要更好的设计。有人可以建议一个设计吗?

1 个答案:

答案 0 :(得分:0)

您能看看春季批吗?我认为它确实可以满足您的需求。将尝试找到一个很好的例子并更新此答案

发现: https://spring.io/guides/gs/batch-processing/https://www.mkyong.com/spring-batch/spring-batch-hello-world-example/

此方法的工作方式是完全异步处理。您定义一个读取器,一个处理器和一个写入器,将这三个绑定在一起,它们可以并行工作。当然,假设您可以读取数据块(分页),那么它可以成为功能强大的工具。

我从未尝试理解和使用的“扩展”,但是如果有时间,它可能对您真的很有用(因为对我来说似乎满足了您的需求)是“ spring xd”,但我担心我未能充分理解它。我已经使用过Spring批处理,并且似乎是实现您所要求的简单易行的方法