我是这样实现长时间运行的线程的:
public class LongRunningWorker implements Runnable {
@Override
public void run() {
try {
while (!Thread.currentThread().isInterrupted()) {
// get a job from threadsafe job queue and run it.
Job job = jobQueue_.removeJob();
execute(job);
TimeUnit.SECONDS.sleep(workerSleepSec_);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
LOGGER.info("runner quit");
// Clean up
cleanup();
}
}
}
在main函数中,我将它们添加到执行器中:
ExecutorService executor_ = Executors.newFixedThreadPool(numOfThreads);
for (int i = 0; i < num; ++i) {
executor_.submit(new LongRunningWorker(jobQueue));
}
原来LongRunningWorker并不总是在运行。执行了几个小时后,我发现了所有那些LongRunningWorker退出。为什么呢?如果我想让它一直运行,该怎么做?
似乎你不理解ExecutorService的意义:没有必要"手动"保持那些线程的活动。框架会为你做这些。
换句话说:ExecutorService的思想就是你继续向它提交任务。底层实现为您管理线程。当您选择固定线程池服务时,请放心,您将始终使用给定的线程数运行。
编辑:考虑到你的评论-如果你主要关注的是需要与使用它们的线程一起管理的"资源";然后我看到两个选项:
- 而不是使用ExecutorService框架你做你自己的完整的管理实现(听起来不像一个好主意,不是吗)
- 你确保你的任务可以请求"自由"的资源:这意味着你保留了ExecutorService,但是添加了一些自己的代码来管理任务将需要的资源独立于ExecutorService线程的。