3

我有一个为不同的电子邮件地址发送电子邮件的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
        );

并调用执行方法:

notifTaskExecutor.execute(new NotificationSender(request, name));

NotificationSender 只是发送电子邮件,所有代码都在 try catch 中,非常简单,即使 run 方法为空,线程也不会终止

需要帮助

问候

4

1 回答 1

6

如果您查看您的线程转储,线程正在任务队列中等待更多任务。即这是预期的行为。

仅当所有非守护线程都已终止并且线程池使用非守护线程时,JVM 才会退出。

您应该调用线程池上的 shutdown() 方法将其关闭。您可以在提交任务后立即调用此方法,因为已经提交的任务将在关闭之前进行处理(与 shutdownNow 方法不同)。

或者,也可以有一个使用守护线程的线程池。当最后一个非守护线程退出时,这些将自动关闭。

但是在您的情况下,您希望我使用关闭方法。您还可以在调用 shutdown 后调用 awaitTermination 方法来等待您的任务完成,以便打印日志消息等。

于 2012-09-14T07:53:31.700 回答