长时间运行线程实现的问题



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

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框架你做你自己的完整的管理实现(听起来不像一个好主意,不是吗)
  1. 你确保你的任务可以请求"自由"的资源:这意味着你保留了ExecutorService,但是添加了一些自己的代码来管理任务将需要的资源独立于ExecutorService线程的
编辑:进一步思考你的问题…您应该检查是否存在导致线程停止的其他问题(如未捕获的异常)。也许你可以尝试捕捉更广泛的异常

相关内容

  • 没有找到相关文章

最新更新