长 运行 线程实现的问题

trouble with long running thread implementation

我是这样实现长运行线程的:

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();
            }
        }
}

在主函数中,我在执行器中添加了它们:

ExecutorService executor_ = Executors.newFixedThreadPool(numOfThreads);
for (int i = 0; i < num; ++i) {
            executor_.submit(new LongRunningWorker(jobQueue));
}

原来 LongRunningWorker 并不总是 运行。执行几个小时后,我发现了所有那些 LongRunningWorker 出口。为什么?如果我想让它始终 运行,该怎么做?

看来您不明白 ExecutorService 的要点:没有必要 "manually" 让那些线程保持活动状态。 框架 将为您做到这一点。

换句话说:ExecutorService 的想法是您只需继续向其中提交任务即可。底层实现为您管理线程。当您选择 fixed thread pool service 时,请放心,您将始终 运行 给定的线程数。

编辑:鉴于您的评论 - 如果您的主要关注点是 "resources" 需要与使用它们的线程一起管理;然后我看到两个选项:

  1. 您不使用 ExecutorService 框架,而是完成自己的管理实现(听起来不是个好主意,是吗)
  2. 您确保您的任务可以请求 "free" 资源:这意味着您保留 ExecutorService,但添加一些自己的代码来管理任务需要的资源 独立 的 ExecutorService 线程。

编辑:进一步考虑您的问题...您应该检查是否没有 其他 问题(如未捕获的异常)导致您的线程停止。或许您可以尝试捕获更大范围的异常。