Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Thread.sleep()和ScheduleXecutorService.scheduleWithFixedDelay的性能注意事项_Java_Multithreading_Threadpool_Scheduledexecutorservice - Fatal编程技术网

Java Thread.sleep()和ScheduleXecutorService.scheduleWithFixedDelay的性能注意事项

Java Thread.sleep()和ScheduleXecutorService.scheduleWithFixedDelay的性能注意事项,java,multithreading,threadpool,scheduledexecutorservice,Java,Multithreading,Threadpool,Scheduledexecutorservice,我正在尝试编写一个用于轮询的守护进程线程,它将每“3”秒轮询一次。我见过3种方法。我不知道该选哪一个?我想知道性能方面的考虑。哪一个可以是一致的并且占用较小的内存块 方法1:使用TimerTask(不打算使用它) 方法2:使用ScheduledExecutorService 方法3:使用Thread.sleep() 如果我将其归结为如下代码: 进近#2 为了 方法#3 据我所知,与普通线程相比,线程池是一种沉重的对象。 我想知道使用这两种方法的优缺点是什么 提前谢谢 问候,, JE 保持规则间隔

我正在尝试编写一个用于轮询的守护进程线程,它将每“3”秒轮询一次。我见过3种方法。我不知道该选哪一个?我想知道性能方面的考虑。哪一个可以是一致的并且占用较小的内存块

方法1:使用TimerTask(不打算使用它)

方法2:使用ScheduledExecutorService

方法3:使用Thread.sleep()

如果我将其归结为如下代码:

进近#2

为了

方法#3

据我所知,与普通线程相比,线程池是一种沉重的对象。 我想知道使用这两种方法的优缺点是什么

提前谢谢

问候,,
JE

保持规则间隔的MSG可能会导致端点溢出,如果由于某种原因端点变慢,那么我认为您应该考虑推送请求的节流,而不是盲目地按规则间隔推送请求。基于所有这些需求,我认为您可以选择ExecutorService,而不是TimerTask或低级线程方法。


ExecutorService的示例

将创建多少个线程?@ErdinçTaşkın此守护进程线程将是单个的,它将轮询并执行某些操作并休眠,再次唤醒并执行某些操作并在固定的持续时间内休眠。3秒时只有一个线程的标准与性能无关。我想你需要考虑其他标准,可能是3秒、30秒或300秒。这取决于客户。我们将其作为一个可配置参数。大部分时间是30秒。我还担心每种方法都会占用堆空间。如果您的硬件太小/太慢或运行太多应用程序实例,您可能需要关心它,否则就忘了它。
    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();
    }

}