【发布时间】:2018-02-08 11:00:22
【问题描述】:
我知道 ExecutorService 的目的是回收相同的线程,但在这种情况下,我确实需要为每个提交的任务指定一个新线程。
这里是初始化:
ExecutorService COMMAND_EXECUTOR_SERVICE = Executors.newFixedThreadPool(1);
命令来时:
Task commandExecutionTask = new Task() {
@Override
protected Object call() {
// do something with the command
}
}
然后:
COMMAND_EXECUTOR_SERVICE.submit(commandExecutionTask);
我怎样才能做到这一点?目的是确保刚刚运行的线程被正确地垃圾收集。
【问题讨论】:
-
当您的池 (executorservice) 处于活动状态时,线程不会被垃圾收集。执行完任务线程后,如果有新任务,则返回池执行新任务。
-
@user3714601,如果执行程序不保留对线程的任何硬引用。诸如此类的启动和结束线程的问题在其他地方(在系统上下文切换中,这很昂贵)。
-
虽然
ThreadPoolExecutor允许覆盖execute,但其中引用的一些方法(例如addWorker)以及实例字段(例如workQueue)是私有的,因此使用带有ThreadPoolExecutor构造函数似乎不是一个选项... -
@M.Prokhorov,你在说什么?我的意思是,如果不是为了减少池中的线程数,执行程序如何丢失对线程的引用?
-
您可以通过
setCorePoolSize()到0让每个线程在没有更多工作完成时立即终止。但是,我怀疑您希望线程被“垃圾收集”的原因。你能解释一下为什么你认为线程应该“正确收集垃圾”吗?
标签: java multithreading executorservice