首页 > 解决方案 > 在不知道何时完成所有任务的情况下关闭执行程序

问题描述

我有一个任务应该等待一个条件(OpenCms 启动),然后通知一些听众。为此,我使用了 ExecutorService:

public void check(final ExecutorService executorService) {
    executorService.submit(() -> {
        waitForInitialization();
        notifyListeners();
    });
}


private void waitForInitialization() {
        while (OpenCms.getRunLevel() < OpenCms.RUNLEVEL_4_SERVLET_ACCESS) {
            try {
                TimeUnit.SECONDS.sleep(10);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    }

问题是如何关闭这个执行器。我可以使用awaitTermination,但我应该提供一个我不确切知道的超时。它可能因环境而异。

标签: javamultithreadingexecutorserviceopencms

解决方案


问题是如何关闭这个执行器。我可以使用 awaitTermination 但我应该提供一个我不确切知道的超时。它可能因环境而异。

我要问的问题是你需要超时吗?通常,如果您知道某项工作将在某个时候完成,我只需等待超时Long.MAX_VALUE——实际上是永远。其他时候我会做类似的事情:

  1. threadPool.shutdown();
  2. threadPool.awaitTermination(...)一些小的值(可能是 10 秒)
  3. threadPool.shutdownNow();中断线程
  4. threadPool.awaitTermination(...);因为Long.MAX_VALUE我知道工作最终会完成

它可能因环境而异。

如果它可能会有所不同,那么也许您应该能够计算出每个环境的适当超时时间?

最后,不要害怕传入ThreadFactory创建守护线程的 a。对于某些作业,我shutdown()使用线程池,但从不等待它们完成,因为我不关心它们的状态,所以我在启用守护程序的池中创建线程,可能使用类似以下线程工厂的东西。

/** Thread factory which sets name and optionally daemon */
public class PoolNameThreadFactory implements ThreadFactory {

    private final String poolName;
    private final Boolean daemon;
    private final AtomicInteger threadNum = new AtomicInteger(0);

    public PoolNameThreadFactory(String poolName) {
        this(poolName, null);
    }

    public PoolNameThreadFactory(String poolName, boolean daemon) {
        this(poolName, (Boolean) daemon);
    }

    private PoolNameThreadFactory(String poolName, Boolean daemon) {
        this.poolName = poolName;
        this.daemon = daemon;
    }

    @Override
    public Thread newThread(Runnable r) {
        Thread thread = new Thread(r);
        thread.setName(poolName + '-' + threadNum.incrementAndGet());
        if (daemon != null) {
            thread.setDaemon(daemon);
        }
        return thread;
    }
}

推荐阅读