对于我的Java项目,我想并行执行两个任务并合并它们的结果。问题是我必须在每次执行时调用多次(可能是1000次或更多)的方法中执行此操作。 我试着用的ExecutorService和线程池,但如果我宣布的ExecutorService作为一类领域,开始提交的工作吧,在某个时刻,它抛出一个Java - 重用线程池
java.lang.OutOfMemoryError: unable to create new native thread
所以我决定去与此代码:
ExecutorService executor = Executors.newFixedThreadPool(2);
Future<Integer> taskOne = executor.submit(new Callable<Integer>() {
public Integer call() throws Exception {
//Do work...
return 0;
}
});
Future<Integer> task2 = executor.submit(new Callable<Integer>() {
public Integer call() throws Exception {
//Do work...
return 0;
}
});
task1.get();
task2.get();
executor.shutdown();
while(!executor.isTerminated());
问题是,与单线程解决方案相比,采用这种新方法后,应用程序性能更差。我认为这是由于在每个方法调用上创建一个新的线程池的开销。
所以,我的问题是:有没有办法做同样的任务,但不必创建和关闭线程池每个方法的调用?
谢谢。
在每次调用时创建一个线程池没有意义。你能发布原始代码吗? – shmosel
'task1.get()'是一个阻塞操作,所以你已经有了两个任务结果。没有必要关闭执行程序并重新创建它。每次执行应用程序只执行一次。 – Cosu