我有一个for循环,循环大约10亿次。在每次迭代中都有许多数据库查询和计算。简化的伪代码如下所示:
for(int i=0, i<1000000000, i++){
query();
if(...){
compute();
}
}如果我能够并行地设置和运行多个线程,那么每个线程都可以迭代数百万次,这将大大减少时间。
如果没有某种并行处理,就需要几个月的时间才能完成。在这种情况下,通过实现线程可以减少时间吗?我知道Java8中的新流特性,但是升级到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
}
}
}发布于 2018-12-19 10:50:32
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
}发布于 2018-12-19 10:22:04
似乎您需要的是类似于存在于Parallel.For中的C#。这篇文章引用了一个用java:Parallel.For implemented with Java实现自己的Parallel.For implemented with Java的例子。
我不会使用Dang Nguyen sugessted的例子,因为这只是旋转了很多线程,但是因为没有锁定,没有线程安全或适当的并发。有一个很大的变化,当两个线程同时尝试写到数据库中的同一个字段时,您会碰到数据库抛出的异常。
即使使用并行for循环,您仍然有机会在数据库中遇到并发问题,因为并行运行的两个线程任务仍然可以访问同一个数据库实体。
https://stackoverflow.com/questions/53848392
复制相似问题