java进程暂停无限时间并且无法正常退出?

时间:2012-09-14 07:36:31

标签: java multithreading

我有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方法为空,线程也不会终止

需要帮助

问候

1 个答案:

答案 0 :(得分:6)

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

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

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

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

但在你的情况下,你想要我使用shutdown方法。您也可以在调用shutdown之后调用awaitTermination方法以等待任务完成,以便打印日志消息等。