gpt4 book ai didi

java - 如何从执行器中获取线程 'kill'?

转载 作者:行者123 更新时间:2023-12-01 07:11:15 25 4
gpt4 key购买 nike

我有一个 tomcat web 应用程序,我在其中使用 java 执行器来执行一些可运行文件。

首先,我从执行程序实例中分配执行程序服务,如下所示:

executorService = Executors.newFixedThreadPool(nThreads, new MyThreadFactory(threadFactoryName))

然后,我使用执行器服务启动任务:

executorService.execute(new MyRunnable);

然后,它似乎起作用了。但我的问题是,我正在追踪某种泄漏,在运行服务器一段时间后出现此错误:

Caused by: java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:640)
at java.util.concurrent.ThreadPoolExecutor.addIfUnderCorePoolSize(ThreadPoolExecutor.java:703)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:652)
at something.server.ThreadExecutor.execute(MyRunnable.java:91)

我在 tomcat 实例上使用了 java VisualVM 来跟踪线程分配。我看到当我调用“newFixedThreadPool”时,我看到“nThreads”新线程。但在他们的工作完成后,我看到线程的状态处于“等待”状态。

这正常吗?我不相信是这样,我知道可运行程序完成了它们的工作,但执行器服务永远不会释放线程。我该怎么做才能释放它们,或者我完全超出了范围?

最佳答案

我认为您正在为每个请求实例化一个新的ExecutorService,或者类似的东西。

您应该仅实例化一个 ExecutorService 并重用它,或者在完成提交任务后调用该服务的 shutdown()shutdown 函数将等待任务完成,然后释放线程。

关于java - 如何从执行器中获取线程 'kill'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13869240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com