长 运行 线程实现的问题
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" 需要与使用它们的线程一起管理;然后我看到两个选项:
- 您不使用 ExecutorService 框架,而是完成自己的管理实现(听起来不是个好主意,是吗)
- 您确保您的任务可以请求 "free" 资源:这意味着您保留 ExecutorService,但添加一些自己的代码来管理任务需要的资源 独立 的 ExecutorService 线程。
编辑:进一步考虑您的问题...您应该检查是否没有 其他 问题(如未捕获的异常)导致您的线程停止。或许您可以尝试捕获更大范围的异常。
我是这样实现长运行线程的:
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" 需要与使用它们的线程一起管理;然后我看到两个选项:
- 您不使用 ExecutorService 框架,而是完成自己的管理实现(听起来不是个好主意,是吗)
- 您确保您的任务可以请求 "free" 资源:这意味着您保留 ExecutorService,但添加一些自己的代码来管理任务需要的资源 独立 的 ExecutorService 线程。
编辑:进一步考虑您的问题...您应该检查是否没有 其他 问题(如未捕获的异常)导致您的线程停止。或许您可以尝试捕获更大范围的异常。