为什么执行者服务实施的池数增加?

时间:2016-01-15 12:03:10

标签: java multithreading executorservice

我在Weblogic服务器中部署了一个使用Quartz调度程序执行的java程序。程序每10秒执行一次。在java代码中,我使用ExcutorService创建了两个线程,最后我调用了service.shutdown()。但每次石英调度程序运行程序时,它都会通过增加池ID来创建一个新的线程池,如“pool-109-thread-1”和“pool-109-thread-2”,然后是pool-110-thread-1“和“pool-110-thread-2”。所以这个池数量正在增加。是否可以或者我需要在代码中更改某些内容? 示例代码如下:`

public void post(){
ExecutorService service = Executors.newFixedThreadPool(2);
    for (String filePath : strArray) {
service.submit(new PostImages(postURL,filePath)); 
}
service.shutDown();
}

`

3 个答案:

答案 0 :(得分:1)

每次调用Executors.newFixedThreadPool(2)时,都会创建一个包含2个线程的新线程池。如果运行太多次将会出现问题,因为操作系统的进程数会崩溃。

您必须将本地变量转换为静态变量,并且只有1个此线程池的实例,只保留2个线程来执行作业。

答案 1 :(得分:1)

我遇到了同样的问题,这就是您要使用的

如果您想知道某项任务或某批任务何时完成,可以使用ExecutorService.submit(Runnable)。调用此方法将返回一个Future对象,该对象可以放置在Collection中,然后您的主线程将在每个对象的调用Future.get()上进行迭代。这将导致您的主线程停止执行,直到ExecutorService处理完所有Runnable任务为止。

Collection<Future<?>> futures = new LinkedList<Future<?>>();
futures.add(executorService.submit(myRunnable));
for (Future<?> future:futures) {
    future.get();
}

How to wait for all tasks in an ThreadPoolExecutor to finish without shutting down the Executor?

答案 2 :(得分:0)

我认为没关系。它可能会增加池ID,因为旧的还在等待垃圾收集器。