我想知道这两个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分钟内创建,依此类推......):

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(),请看这个。