newScheduledThreadPool(1)和newSingleThreadScheduledExecutor()之间的区别

use*_*206 6 java

我想知道这两个Executors类的方法有什么区别?我有一个Web应用程序,我每100毫秒检查一些数据,这就是为什么我使用scheduleWithFixedDelay方法的调度程序.我想知道在这种情况下我应该使用哪种方法(newScheduledThreadPool或newSingleThreadScheduledExecutor)?我还有一个问题 - 在VisualVM中我监视我的Glassfish服务器我注意到我有一些处于PARK状态的线程 - 例如:

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)
Run Code Online (Sandbox Code Playgroud)

是否有可能这些线程与调度程序连接,因为我不知道还有什么会创建它们?这些线程永远不会被破坏,所以我担心这会导致一些麻烦.这是一个截图(新的Thread-35将在15分钟内创建,依此类推......):

在此输入图像描述

Tag*_*eev 8

正如文件所述:

与其他等效的newScheduledThreadPool(1)不同,保证返回的执行程序不可重新配置以使用其他线程.

因此,在使用时,newScheduledThreadPool(1)您可以在以后添加更多线程.


win*_*ngs 5

newSingleThreadScheduledExecuto()由委托包装,正如您在Executors.java 中看到的:

public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
    return new DelegatedScheduledExecutorService(new ScheduledThreadPoolExecutor(1));
}
Run Code Online (Sandbox Code Playgroud)

差异(来自 javadoc):

如果这个单线程由于在关闭之前的执行过程中失败而终止,如果需要执行后续任务,新的线程将取而代之。

与其他等效的 {@code newScheduledThreadPool(1)} 不同,返回的执行器保证不可重新配置以使用其他线程。

回复你的评论:

这是否也适用于 newScheduledThreadPool(1) ?

不,您需要自己处理线程故障。

至于 Unsafe.park(),请看这个