有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java7是否可以对for循环执行多线程?

我有一个for循环,循环大约10亿次。在每次迭代中都有许多数据库查询和计算。简化的伪代码如下所示:

for(int i=0, i<1000000000, i++){
    query();
    if(...){
        compute();
    }  
}

如果我可以并行设置和运行多个线程,这样每个线程都会迭代数百万次,这将大大减少时间

如果没有某种并行处理,需要几个月才能完成。在这种情况下,是否可以通过实现线程来减少时间?我知道Java8中的新streams功能,但升级到Java8不是我的选择

如果有一个容易遵循的指南,那也太好了!提前谢谢

编辑:下面是更详细的代码。每次插入时,我都可能会多次检查数据库,而且在执行此操作之前,我必须处理数据。理想情况下,我希望多个线程共享工作负载

for(int i = 1; i<=100000000; i++){
            String pid = ns.findPId(i); //query
            object g = findObject(pid) //query
            if(g!=null){
                if(g.getSomeProperty()!=null && g.getSomeProperty().matches(EL)){ 
                    int isMatch = checkMatch(pid); //query
                    if(isMatch == 0){ 
                        String sampleId = findSampleId(pid); //query
                        if(sampleId!=null){
                            Object temp = ns.findMoreProperties(sampleId); //query
                            if(temp!=null){
                                g.setSomeAttribute(temp.getSomeAttribute());
                                g.setSomeOtherProperty(temp.getSomeOtherProperty()); 
                                insertObject(g); //compute, encapsulate and insert into database table
                            }
                        }
                    }else{
                        //log
                    }
                }
            }

共 (2) 个答案

  1. # 1 楼答案

    1)评估并查看是否需要ThreadPoolExecutor:

    ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(10);
    

    2)为第一部分写一个可调用的

    public class FindObjectCallable implements Callable<Object> {
        ...
    
        @Override
        public Object call() throws Exception {
            String pid = ns.findPId(i); //query
            return findObject(pid) //query
        }
    }
    

    3)执行以下操作的主要代码:

        ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(10);
    
        List<Future<Object>> futures = new ArrayList<Future<Object>>(0);    
    
        for(int i = 1; i<=100000000; i++) {
            FindObjectCallable callable = new FindObjectCallable( ns, i );
            Future<Object> result = executor.submit(callable);
            futures.add(result);
        }
    
        for( Future<Object> future: futures )
        {
            // do a java 7 lambda equivalent for the g processing part
        }
    
  2. # 2 楼答案

    看起来你需要的是类似于平行线的东西。因为它存在于C#中。 这篇文章用一个例子来解决这个问题,一个人实现了他自己的并行。对于java中的:Parallel.For implemented with Java

    我不会使用Dang Nguyen Sugested的例子,因为这只是在旋转大量线程,但因为没有锁定,就没有线程安全性或适当的并发性。当两个线程试图同时写入数据库中的同一字段时,会遇到数据库引发的异常

    即使使用parallel for循环,我认为您仍然有可能在数据库中遇到并发问题,因为并行运行的两个线程任务可能仍然是关于访问同一个数据库实体