每n分钟新线程一次(java.lang.thread.State:在sun.misc.Unsafe.park等待(本机方法))

每n分钟新线程一次(java.lang.thread.State:在sun.misc.Unsafe.park等待(本机方法)),java,glassfish,Java,Glassfish,我阅读了所有现有的主题,但没有找到任何解决问题的方法。我用VisualVM监控我的glassfish服务器,我注意到一些奇怪的行为。以下是截图: java.lang.Thread.State: WAITING at sun.misc.Unsafe.park(Native Method) - parking to wait for <3cb9965d> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$Co

我阅读了所有现有的主题,但没有找到任何解决问题的方法。我用VisualVM监控我的glassfish服务器,我注意到一些奇怪的行为。以下是截图:

java.lang.Thread.State: WAITING
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for <3cb9965d> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1088)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)


编辑:每20分钟创建一次新线程,即使服务器上没有部署任何应用程序。有人注意到类似的问题吗?我还注意到所有新线程都在等待相同的ID(在本例中).

也许您的观察反映了线程池的行为

如果某个线程在线程池中空闲了一段时间,它将从线程池中删除

根据您在glassfish的domain.xml中的设置,将创建一个新线程,以满足池中线程的最小数量。请注意,如果未在domain.xml-file中指定默认值,glassfish将使用自己的默认值

这些线程都具有相同的ID,因为它们属于相同的线程池

验证是否可以将属性idle thread timeout seconds=“300”添加到domain.xml中的http线程池中,并使用VisualVM再次检查该属性


您好,您的代码中是否有任何同步?您好,没有同步。即使glassfish服务器上没有部署任何应用程序(仅运行glassfish),也会发生这种情况。我检查了所有设置,没有发现任何可能导致此问题的因素。它仍然每20分钟创建一个新线程,并一直等待……您说您正在使用
newSingleThreadExecutor()
。你到底是如何使用它的?我在我的帖子中添加了一个使用它的例子。但正如我所说的——新线程每20分钟生成一次,即使在部署到服务器(只运行glassfish)中没有应用程序!谢谢你的建议。我尝试了这个设置,但线程仍然是每20分钟创建一次。我还检查了是否有si编号1200,但我没有找到它。您是否注意到您的服务器或您的服务器上存在相同的行为?无论如何,你能解释一下http线程池的最大/最小线程池大小的建议设置是什么(5够了吗)?
ScheduledExecutorService service = service = Executors.newSingleThreadScheduledExecutor();
service.scheduleWithFixedDelay(new Runnable() {
            @Override
            public void run() {
                //do something...
            }
        }, 1, readInterval, TimeUnit.MILLISECONDS);