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

时间:2015-05-04 11:19:21

标签: java

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

+

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

enter image description here

3 个答案:

答案 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() {
      ...
    }

   }