java - 是否必须关闭线程池?

标签 java multithreading executorservice

我有一个 Web 方法,它调用执行计算任务的方法。我已经使用多线程方法使用 java ExecutorService 来调用此方法。这是到目前为止我的代码:

@WebMethod
public void performIntensiveCalculation()
{
    ExecutorService pool = CalculationThreadPool.getInstance().getThreadPool();
    pool.execute( calculate );
}

我的 CalculationThreadPool 实现如下,

public class CalculationThreadPool
{

    private static CalculationThreadPool instance;

    private ExecutorService pool;

    private CalculationThreadPool()
    {
        pool = Executors.newFixedThreadPool( 3 );
    }

    public synchronized static CalculationThreadPool getInstance()
    {
        if( instance == null )
        {
            instance = new CalculationThreadPool();
        }
        return instance;
    }

    public ExecutorService getThreadPool()
    {
        return pool;
    }  

}

由于此方法作为 Web 方法公开,因此可以随时发出请求来执行计算。我无法理解的是如何在创建的池中调用关闭方法。如果我在 pool.execute() 行之后调用 pool.shutdown() ,以后的请求将无法使用线程池。

在不关闭的情况下保留线程池是一个不好的做法吗?我是否使用了错误的方法来完成任务?还有更好的办法吗?

最佳答案

连接池应该在您的 web 应用程序生命周期内可用,否则,使用它只会导致开销!这就是为什么您的 CalculationThreadPool 使用单例模式。
我认为您不需要手动关闭线程池,因为 jvm 会在关闭时杀死所有线程。无论如何,如果您仍然需要手动关闭,一种解决方案是添加一个 ServletContextListener 并在其 contextDestroyed 方法中执行此操作。像这样的事情:

@WebListener
public class MyContextListener implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent e)
    {
        CalculationThreadPool.getInstance().getThreadPool().shutdownNow();
    }
}

请注意,关闭线程池有两种方法:shutdownshutdownNow,它们在处理当前正在运行的任务方面略有不同,您可以采取看看ExecutorService documentation了解更多详情。

关于java - 是否必须关闭线程池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59014942/

相关文章:

java - 如何在ThreadFactory中初始化ThreadLocal变量?

java - 无法使用 Maven 构建应用程序,我可以在本地运行代码,但无法在 heroku 上部署

java - Java-Android 上的 MulticastSocket 问题

java - 用java中的非转义等效字符串替换所有转义序列

java - 我可以将 FlatfileItemReader 与 Taskexecutor 一起使用吗?

java - 如果发生异常则退出 Java Callable

java - 生成最终存档时出错 : Debug certificate expired on

java - "Found 1 deadlock"但跟踪显示未被任何线程锁定

c - 在 Windows 上使用 C 中的线程。简单的例子?

Java,多线程,ExecutorService