java - 当一个线程死亡时,Java 线程池自动排队并执行/提交一个新线程
问题描述
我有一个使用创建的线程池ExecutorService.newFixedThreadPool
。我executed
在这个池中拥有完全相同数量的线程,并且我的线程永远在运行守护进程。我想要完全运行相同逻辑的 n 头。当然,我可以在这个线程池的队列中提供“足够”的线程,但我不能将无限数量的线程放入其中。一种可能“覆盖足够的基础”的方法是在我的线程中,我可以catch (Throwable e)
然后重新开始,就好像线程是新的一样。但这似乎很老套。有什么建议吗?
谢谢
我特别搜索了互联网和 StackOverflow。但是大多数文献都假设线程是为了完成,这不适用于这里。
解决方案
ThreadPoolExecutor已经实现了,当一个死机自动添加一个新的worker。
在Worker.runWorker() - 主工作者运行循环
Thread wt = Thread.currentThread();
Runnable task = w.firstTask;
w.firstTask = null;
w.unlock(); // allow interrupts
boolean completedAbruptly = true;
try {
while (task != null || (task = getTask()) != null) {
...
try {
beforeExecute(wt, task);
Throwable thrown = null;
try {
task.run();
} catch (RuntimeException x) {
thrown = x; throw x;
} catch (Error x) {
thrown = x; throw x;
} catch (Throwable x) {
thrown = x; throw new Error(x);
} finally {
afterExecute(task, thrown);
}
} finally {
task = null;
w.completedTasks++;
w.unlock();
}
}
completedAbruptly = false;
} finally {
processWorkerExit(w, completedAbruptly);
}
在processWorkerExit()中:为垂死的工人执行清理和记账
if (completedAbruptly) // If abrupt, then workerCount wasn't adjusted
decrementWorkerCount();
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try {
completedTaskCount += w.completedTasks;
workers.remove(w);
} finally {
mainLock.unlock();
}
tryTerminate();
...
if (runStateLessThan(c, STOP)) {
...
addWorker(null, false);
}
推荐阅读
- apache-nifi - NiFi 是否可以通过远程进程组连接到自身?
- python - 从 pymodbus 读取 float32 值会给出不正确的值,但 modscan 或 ComTestPro
- angular - 以角度返回 [Object Object]
- python - 模板化 Terraform 文件是个好主意吗?
- javascript - JQuery检查JSON数据是否包含某个键
- javascript - 在量角器中,如何将函数中的值返回到“it block”
- python - Curve_fit python 有很多参数
- json - 使用 JQ 从 curl 的 JSON 输出中过滤
- python - 卡在继续?[y/n] 在 Jupiter Notebook 中
- google-ads-api - Adwords API - 如何使用 AWQL 从 Adwords 报告中排除 NULL 值