【发布时间】:2015-07-29 15:07:06
【问题描述】:
我正在尝试使用批处理操作从 facebook 获取帖子。 我想过让这个任务多线程来加速操作。 基本上,我向 facebook 发送批量请求,在等待响应时,我的任务是做其他需要做的事情。 当我(慢慢地)调试任务时,我得到了我想要测试的 2000 个结果.... 但是当我运行它或让它在请求操作后调试和暂停时,它会小于 2000。
String[] str = new String[2000];
ExecutorService exec = Executors.newFixedThreadPool(10);
List<BatchRequest> request= new CopyOnWriteArrayList<BatchRequest>();
List <BatchResponse> batchResponses = new ArrayList<BatchResponse>();
int i=1;
for(int j=0 ; j<2000; j++) {
if (i < 50) {
BatchRequest batch = new BatchRequestBuilder(str[i]).build();
request.add(batch);
i++;
counter++;
} else {
i = 1;
exec.execute(new Runnable() {
//thread that gets information from facebook into a list of responses
public void run() {
// TODO Auto-generated method stub
System.out.println("running");
batchResponses.addAll(fc.executeBatch(request));
System.out.println("done");
}
});
request.clear();
}
}
exec.shutdown();
exec.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
我已经删除了所有不必要的东西。希望它仍然有意义。
我的代码有什么问题?
编辑:我编辑了代码以使其更有意义。有人吗?
【问题讨论】:
-
创建一个示例来说明没有数据库逻辑的相同问题可能会有所帮助(即,而不是 while rs.next() 创建一个迭代 2000 次的循环,而不是创建 batchResponses 数组创建一个字符串数组等)。这将为我们提供可以直接执行和调试的代码,而不必自己进行这些修改来重现您所询问的问题。
标签: java multithreading collections