我想知道这两个Executors类的方法有什么区别?我有一个Web应用程序,我每100毫秒检查一些数据,这就是为什么我使用scheduleWithFixedDelay方法的调度程序。我想知道在这种情况下我应该使用哪种方法(newScheduledThreadPool或newSingleThreadScheduledExecutor)? 我还有一个问题 - 在VisualVM中我监视我的Glassfish服务器我注意到我有一些处于PARK状态的线程 - 例如:
+
这些线程是否可能与调度程序连接,因为我不知道还有什么会创建它们?这些线程永远不会被破坏,所以我担心这会导致一些麻烦。这是一个截图(新的Thread-35将在15分钟内创建,依此类推......):
答案 0 :(得分:8)
正如documentation所述:
与其他等效的newScheduledThreadPool(1)不同,保证返回的执行程序不可重新配置以使用其他线程。
因此,当使用newScheduledThreadPool(1)
时,您将能够在以后添加更多线程。
答案 1 :(得分:4)
newSingleThreadScheduledExecuto()由委托包装,您可以在 Executors.java 中看到:
public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
return new DelegatedScheduledExecutorService(new ScheduledThreadPoolExecutor(1));
}
差异(来自javadoc):
如果这个单线程由于在关闭之前执行期间的故障而终止,那么如果需要执行后续任务,新线程将取代它。
与其他等效的{@code newScheduledThreadPool(1)}不同,保证返回的执行程序不可重新配置以使用其他线程。
回复你的评论:
不,你需要自己处理线程故障。这样做是否也适用于newScheduledThreadPool(1)?
至于Unsafe.park(),请参阅this。
答案 2 :(得分:1)
正如机翼和tagir所指出的那样,差异在于“如何管理失败”。
关于线程您的线程处于等待状态; park
不是状态,而是将线程置于等待状态的方法;另见
How to detect thread being blocked by IO?
但是,让我建议一种在Java EE上实现预定线程的不同方法;你应该看看EJB的TimerService
@Singleton
public class TimerSessionBean {
@Resource
TimerService timerService;
public void setTimer(long intervalDuration) {
Timer timer = timerService.createTimer(intervalDuration,
"Created new programmatic timer");
}
@Timeout
public void lookForData(Timer timer) {
//this.setLastProgrammaticTimeout(new Date());
....
}
//OR
@Schedule(minute = "*/1", hour = "*")
public void runEveryMinute() {
...
}
}