Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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线程作为任务调度程序,_Java_Multithreading_Scheduler - Fatal编程技术网

使用Java线程作为任务调度程序,

使用Java线程作为任务调度程序,,java,multithreading,scheduler,Java,Multithreading,Scheduler,我想每毫秒安排一次任务,我知道计时器、执行器等等。我发现这个方法是最准确的。但我只是想知道,对于一个(大型)项目来说,我的方式会不会太沉重 您的方法为每个重复任务创建一个新线程。每个线程都需要分配整个堆栈。因此,方法的内存消耗比需要的要大得多。如果创建足够多的计时器线程,这可能会成为一个问题 如果要执行大量此类任务,最好使用java.util.Timer和TimerTasks 顺便说一句,正如所写的,您的任务时间会漂移,因为在触发任务和重置time变量之间偶尔会有额外的毫秒或更长的时间。但是,这

我想每毫秒安排一次任务,我知道计时器、执行器等等。我发现这个方法是最准确的。但我只是想知道,对于一个(大型)项目来说,我的方式会不会太沉重


您的方法为每个重复任务创建一个新线程。每个线程都需要分配整个堆栈。因此,方法的内存消耗比需要的要大得多。如果创建足够多的计时器线程,这可能会成为一个问题

如果要执行大量此类任务,最好使用java.util.Timer和TimerTasks


顺便说一句,正如所写的,您的任务时间会漂移,因为在触发任务和重置
time
变量之间偶尔会有额外的毫秒或更长的时间。但是,这可以在代码中修复。

您的方法为每个重复任务创建一个新线程。每个线程都需要分配整个堆栈。因此,方法的内存消耗比需要的要大得多。如果创建足够多的计时器线程,这可能会成为一个问题

如果要执行大量此类任务,最好使用java.util.Timer和TimerTasks


顺便说一句,正如所写的,您的任务时间会漂移,因为在触发任务和重置
time
变量之间偶尔会有额外的毫秒或更长的时间。但是,这可以在代码中修复。

您的代码存在多个问题

1.您的代码正在持续执行,但如果未准备就绪,则应等待给定的时间。您可以使用延迟队列或其他可用的并发api,如果项目未准备就绪,则可等待或休眠,当项目准备就绪时,将通知工作线程


2.它是单线程的,如果它中断或一个任务花费很长时间,那么它将退出下一个计划。例如,它不是逻辑上每30秒计划一次。它在执行完成后从计算的位置开始计数。

您的代码有多个问题

1.您的代码正在持续执行,但如果未准备就绪,则应等待给定的时间。您可以使用延迟队列或其他可用的并发api,如果项目未准备就绪,则可等待或休眠,当项目准备就绪时,将通知工作线程


2.它是单线程的,如果它中断或一个任务花费很长时间,那么它将逃避下一个计划。例如,它不是逻辑上每30秒计划一次。它是在执行完成后从计算的位置开始计数。

我不清楚你在问什么。我认为while循环可能负载很重,我想使用这样一个循环调度程序经常出现在程序中。您正在优化不需要优化的内容。使用Timer类,它更容易理解100倍。看看我不清楚你在问什么。我认为while循环可能负载很重,我想在程序中经常使用这样的调度器。你在优化不需要优化的东西。使用Timer类,它更容易理解100倍
    new Thread(() -> {
        long time = System.currentTimeMillis();
        while (true) {
            if (System.currentTimeMillis() - time >= 1000) {
                // Scheduled task
                System.out.println(new SimpleDateFormat("HH:mm:ss:SSS").format(new Date(System.currentTimeMillis())));
                time = System.currentTimeMillis();
            }
        }
    }).start();