我正在尝试编写一个用于轮询的守护程序线程,该线程将每隔“3”秒轮询一次。我已经看过3种方法。我不确定要去哪一个?我想知道性能注意事项。哪一个可能是一致的,并且将占用较小的内存块?


    new Timer().scheduleAtFixedRate(task, firstTime, period)



如果我归结为这样的代码:


public class Test {

    static TimerTask timerTask = new TimerTask() {
        @Override
        public void run() {
              // Do polling & Other business logic
            System.out.println("=="+new Date());
        }
    };

    public static void main(String[] args) {

        ScheduledExecutorService scheduler = Executors
                .newSingleThreadScheduledExecutor();
        scheduler.scheduleWithFixedDelay(timerTask, 0, 3, TimeUnit.SECONDS);

    }
}

为了


public class Test {

    static Runnable task = new Runnable() {
        @Override
        public void run() {
            while (true) {
                try {
                // Do polling & Other business logic
                    System.out.println("**"+new Date());
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };

    public static void main(String[] args) {
        new Thread(task).start();
    }

}

据我了解,与普通线程相比,线程池是一种繁重的对象。
我想知道使用这两种方法的利弊是什么?

提前致谢。

问候,
乙脑

最佳答案

如果端点由于某种原因变慢,继续以规则的间隔推送msg可能会在端点上导致溢出,因此,我认为您也应该考虑限制请求的发送,而不是盲目地按固定间隔推送请求。基于所有这些要求,我认为您可以选择ExecutorService,而不是TimerTask或低级线程方法。
ExecutorService的示例http://tutorials.jenkov.com/java-util-concurrent/executorservice.html

关于java - Thread.sleep()和schedulerExecutorService.scheduleWithFixedDelay的性能注意事项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22524752/

10-11 10:49