使用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();