首页 > 解决方案 > 当一个线程死亡时,Java 线程池自动排队并执行/提交一个新线程

问题描述

我有一个使用创建的线程池ExecutorService.newFixedThreadPool。我executed在这个池中拥有完全相同数量的线程,并且我的线程永远在运行守护进程。我想要完全运行相同逻辑的 n 头。当然,我可以在这个线程池的队列中提供“足够”的线程,但我不能将无限数量的线程放入其中。一种可能“覆盖足够的基础”的方法是在我的线程中,我可以catch (Throwable e)然后重新开始,就好像线程是新的一样。但这似乎很老套。有什么建议吗?

谢谢

我特别搜索了互联网和 StackOverflow。但是大多数文献都假设线程是为了完成,这不适用于这里。

标签: javamultithreadingthreadpool

解决方案


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

推荐阅读