【问题标题】:Java thread pool to automatically enqueue and execute/submit a new thread, when one dies当一个线程死亡时,Java 线程池自动排队并执行/提交一个新线程
【发布时间】:2019-09-05 01:06:04
【问题描述】:

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

谢谢

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

【问题讨论】:

  • Runnable 的 run() 方法是一个线程入口点。使用 try/catch 将代码包装在线程入口点始终是一个好习惯。这将防止线程由于异常而退出,在大多数情况下保持线程处于活动状态。这没有什么“hacky”。​​

标签: java multithreading threadpool


【解决方案1】:

ThreadPoolExecutor已经实现,当一个worker自动死亡时添加一个新的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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-22
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多