繁体   English   中英

Java 7中DTO的并行处理

[英]Parallel Processing of DTO in Java 7

我要求在哪里需要处理和映射DTO,以及for循环中的值,如下所示。 这里的每种映射方法都将花费近10分钟的时间来完成其业务逻辑,从而导致性能延迟。 我正在努力完善业务逻辑算法。 但是,请让我知道是否可以并行处理这些映射方法中的每一种以提高性能。

由于应用程序仅与Java 7兼容,因此我无法使用Java 8的流。

for(Portfolio pf : portfolio) {
   mapAddress(pf);
   mapBusinessUnit(pf);
   mapRelationShipDetails(pf)
   --
   --
   --
}

您可以使用RunnableCallable将投资组合划分为不同的线程。

例如:

public class PortfolioService implements Callable<List<Portfolio>>
{
    List<Portfolio> portfolios;
    public PortfolioService(List<Portfolio> portfolios)
    {
        this.portfolios = portfolios;
    }


    public List<Portfolio> call()
    {
    for(Portfolio pf : portfolios) {
       mapAddress(pf);
       mapBusinessUnit(pf);
        ...
        }   
     return portfolios;
    }
}

但是,这需要在主类中进行一些修改。 我在这里使用Callable,因为之后我不知道您是否要对所有这些映射的投资组合执行某项操作。 但是,如果您想让线程完成所有工作并且不需要任何回报,请使用Runnable并修改代码。

1)您必须获得核心数量:

int threads = Runtime.getRuntime().availableProcessors();

2)现在,您按线程划分工作负载

// determine the average workload per thread
int blocksize = portfolios.size()/threads;
// doesn't always get all entries 
int overlap = portfolios.size()%threads;

3)启动一个ExecutorService,创建Future元素列表,为数组切片的旧索引创建提醒变量

ExecutorService exs = Executors.newFixedThreadPool(threads);
List<Future<List<Portfoilio>>> futures = new ArrayList();
int oldIndex = 0;

4)启动线程

for(int i = 0; i<threads; i++)
{
    int actualBlocksize = blocksize;
    if(overlap != 0){
    actualBlocksize++;
    overlap--;
    }
    futures.add(exs.submit(new PortfolioService(portfolios.subList(oldIndex,actualBlocksize));
    oldIndex = actualBlocksize;
}

5)关闭ExecutorService并等待其终止

exs.shutdown();
try {exs.awaitTermination(6, TimeUnit.HOURS);}
catch (InterruptedException e) { }

6)如果希望/一定要对未来有所作为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM