Java:ExecutorService和Callables:在循环中重用同一个池?需要关机吗?
我得到了一个循环Java:ExecutorService和Callables:在循环中重用同一个池?需要关机吗?,java,multithreading,loops,executorservice,callable,Java,Multithreading,Loops,Executorservice,Callable,我得到了一个循环{loop-1},在这里我开始线程。包含{Loop-1}的类实现Daemon和Runnable。 在{Loop-1}中,启动的线程调用一个类coordinate.java的方法coordinate(),我在该类中使用ExecutorService 当创建Coordinate.java的对象时(这在{Loop-1}之前发生一次),我将实例化一个ExecutorService pool=Executors.newFixedThreadPool(2) 在coordinate()中,我创
{loop-1}
,在这里我开始线程。包含{Loop-1}
的类实现Daemon和Runnable。
在{Loop-1}
中,启动的线程调用一个类coordinate.java
的方法coordinate()
,我在该类中使用ExecutorService
当创建Coordinate.java
的对象时(这在{Loop-1}
之前发生一次),我将实例化一个ExecutorService
pool=Executors.newFixedThreadPool(2)代码>
在coordinate()
中,我创建了一个类的两个对象,该类实现了Callable,然后启动它们,并将结果存储在未来结果的列表中。
callableResults=pool.invokeAll(线程)代码>
之后,我尝试使用result=future.get()在循环中获取结果代码>
然后,我返回到{Loop-1}
,整个过程再次开始(调用coordinate()
,invokeAll()
,future.get()
现在我有一个问题:
1.在坐标()
中获得结果后,是否需要关闭ExecutorService池?
2.每次调用coordinate()
时,是否需要重新创建池
谢谢你的回答!:-)不,你没有。固定线程池中的线程可以一直使用,直到您对其调用shutdown
。因此,您只需重新提交要执行的新任务并获取其结果,就像您在第一轮中所做的那样。不,您不需要。固定线程池中的线程可以一直使用,直到您对其调用shutdown
。因此,您只需重新提交要执行的新任务并获取其结果,就像第一轮一样。您需要在处理完所有任务后关闭executorService。
任务的提交可以是多个周期
调用executorService.shutDown()
后,可以使用executorService.awaitTermination(10,TimeUnit.SECONDS)
在调用shutDown()后等待所有任务完成
或者,您可以这样做:while(!executorService.isTerminated()){}
处理完所有任务后,您需要关闭executorService。
任务的提交可以是多个周期
调用executorService.shutDown()
后,可以使用executorService.awaitTermination(10,TimeUnit.SECONDS)
在调用shutDown()后等待所有任务完成
或者,您可以执行:while(!executorService.isTerminated()){}
这很难看:while(!executorService.isTerminated()){}
。当有未完成的任务时,它将使核心100%疯狂<代码>等待终止
要好得多。这很难看:而(!executorService.isTerminated()){}
。当有未完成的任务时,它将使核心100%疯狂<代码>等待终止
要好得多。