我有java进程发送不同电子邮件地址的电子邮件,我正在使用java线程池执行程序,每个线程尝试发送电子邮件然后退出
问题是所有线程都要等待状态,即使线程已经成功完成工作,也永远不会回到运行状态,
我的threadPoolExecutor配置如下,
队列大小= 100 线程数= 5 最大线程数= 10 保持活力时间= 1分钟
这里是线程转储,但我不明白是什么
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x2808f538> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(Unknown Source)
at java.util.concurrent.ArrayBlockingQueue.take(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Locked ownable synchronizers:
- None
以下是代码:
ReqtQueue = new ArrayBlockingQueue<Runnable>(100, true);
notifTaskExecutor = new ThreadPoolExecutor(
5, // core size of threads that will remain in idle state
10, // max size of thread that can be created
1, // keep alive time for thread other than number of core threads when they are in idel state
TimeUnit.MINUTES, // keep alive time units
ReqtQueue // the queue to use
);
调用excute方法:
notifTaskExecutor.execute(new NotificationSender(request, name));
NotificationSender只发送电子邮件,所有代码都在try catch中,非常简单,即使run方法为空,线程也不会终止
需要帮助
问候
答案 0 :(得分:6)
如果查看线程转储,则线程正在等待任务队列以执行更多任务。这是预期的行为。
只有当所有非守护程序线程都已终止时,JVM才会退出,并且线程池使用非守护程序线程。
您应该在线程池上调用shutdown()方法将其关闭。您可以在提交任务后立即调用此方法,因为在关闭之前将处理已提交的任务(与shutdownNow方法不同)。
或者,也可以使用一个使用守护程序线程的线程池。当最后一个非守护程序线程退出时,它们将自动关闭。
但在你的情况下,你想要我使用shutdown方法。您也可以在调用shutdown之后调用awaitTermination方法以等待任务完成,以便打印日志消息等。