首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java7 --多线程是可能的吗?

java7 --多线程是可能的吗?
EN

Stack Overflow用户
提问于 2018-12-19 09:41:56
回答 2查看 621关注 0票数 0

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

代码语言:javascript
复制
for(int i=0, i<1000000000, i++){
    query();
    if(...){
        compute();
    }  
}

如果我能够并行地设置和运行多个线程,那么每个线程都可以迭代数百万次,这将大大减少时间。

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

如果有一个容易遵循的指南某处,那将是伟大的!提前谢谢。

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

代码语言:javascript
复制
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
                    }
                }
            }
EN

回答 2

Stack Overflow用户

发布于 2018-12-19 10:50:32

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

代码语言:javascript
复制
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(10);

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

代码语言:javascript
复制
public class FindObjectCallable implements Callable<Object> {
    ...

    @Override
    public Object call() throws Exception {
        String pid = ns.findPId(i); //query
        return findObject(pid) //query
    }
}

( 3)主要代码如下:

代码语言:javascript
复制
    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
    }
票数 1
EN

Stack Overflow用户

发布于 2018-12-19 10:22:04

似乎您需要的是类似于存在于Parallel.For中的C#。这篇文章引用了一个用java:Parallel.For implemented with Java实现自己的Parallel.For implemented with Java的例子。

我不会使用Dang Nguyen sugessted的例子,因为这只是旋转了很多线程,但是因为没有锁定,没有线程安全或适当的并发。有一个很大的变化,当两个线程同时尝试写到数据库中的同一个字段时,您会碰到数据库抛出的异常。

即使使用并行for循环,您仍然有机会在数据库中遇到并发问题,因为并行运行的两个线程任务仍然可以访问同一个数据库实体。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53848392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档