我在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();
}
`
答案 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,因为旧的还在等待垃圾收集器。