我想使用JavaExecutor服务来做以下事情:
for(String s : multiMap.keySet()){
for(String s1 : listB){
for(String s2 : listC){
//API call
}
}
}就像在for循环中一样,完成所需的时间太长了,而且永远不会结束。因此,我正在考虑在executorService中使用它,以便可以更快地完成任务。有没有人可以建议如何使用Executor服务来做到这一点?
注意:使用Java7。
发布于 2017-07-27 11:25:56
以下代码片段是使用ExecutorService解决此问题的示例。
public static void main(String[] args) throws Exception {
int numRunnables = 3;
ArrayList<String> listB = new ArrayList<String>();
ArrayList<String> listC = new ArrayList<String>();
BlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(numRunnables, true);
RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy();
ExecutorService executor = new ThreadPoolExecutor(numRunnables, numRunnables, 0L, TimeUnit.MILLISECONDS, queue, handler);
HashMap<String, String> multiMap = new HashMap<>();
for(String s : multiMap.keySet()){
executor.execute(new Runnable() {
@Override
public void run() {
for(String s1 : listB){
for(String s2 : listC){
}
}
}
});
}
executor.shutdown();
while (executor.isTerminated() == false){
Thread.sleep(50);
}
}此外,我认为'ExecutorService executor = Executors.newFixedThreadPool(numThreads);‘是一个很少使用的函数,但它更易于访问,因此ExecutorService的初始用户经常使用它。当有大量的Runnable,每个都花费了相对较长的时间时,使用Executors.newFixedThreadPool的executor会导致内存问题,然后与像我上面的代码片段一样创建的ThreadPoolExecutor相比,花费的时间要长得多。
https://stackoverflow.com/questions/45340216
复制相似问题