长时间运行的线程实现的麻烦

时间:2016-10-09 18:44:01

标签: java multithreading executorservice

我以这种方式实现了长时间运行的线程:

'fun’ was not declared

在main函数中,我将它们添加到执行程序中:

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

事实证明LongRunningWorker并不总是在运行。经过几个小时的执行,我发现了所有那些LongRunningWorker退出。为什么?如果我想让它一直运行,怎么做?

1 个答案:

答案 0 :(得分:2)

您似乎不明白ExecutorService的要点:没有必要"手动"保持这些线程活着。 框架会为您做到这一点。

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

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

  1. 您可以使用ExecutorService框架来完成自己的管理实施(听起来不是一个好主意,而是使用它)。
  2. 您确保您的任务可以请求"免费" resources:意味着您保留ExecutorService,但添加一些自己的代码来管理ExecutorService线程的作业独立所需的任务资源。
  3. 编辑:进一步考虑您的问题...您应该检查是否存在导致线程停止的其他问题(如未捕获的异常)。也许你可以尝试寻找更广泛的例外。