没有内部类的Java定时器功能
我在代码中实现了以下计时器功能没有内部类的Java定时器功能,java,timer,timertask,Java,Timer,Timertask,我在代码中实现了以下计时器功能 Timer timer = new Timer(); TimerTask tt = new TimerTask() { public void run() { System.out.println("Timer started"); //my Logic }; }; t
Timer timer = new Timer();
TimerTask tt = new TimerTask() {
public void run() {
System.out.println("Timer started");
//my Logic
};
};
timer.schedule(tt, 60000, 60000);
上述计时器每1分钟运行一次。
我在执行这段代码时没有任何问题
因为这段代码有内部类,并且它也重写了run方法
我想知道还有没有其他有效的方法来编写计时器逻辑,或者这是我们处理计时器的唯一方法。如果您使用Java 8,您可以简化代码:
import java.util.Timer;
..
Timer timer = new Timer();
timer.schedule(() -> doSomething(), 60000);
tl;博士
你要求:
没有内部类的Java定时器功能
将任务定义为一个实现可运行
接口的单独类,并将实例提交给ScheduledExecutorService
对象
你会在没有内部类参与的情况下被重复执行
使用执行器服务
如中所述,Timer
/TimerTask
类已被添加到Java5中的executors框架所取代。看
从类中获取executor服务对象。要计划重复任务,请获取一个
定义实现Runnable
提交要作为类型的对象执行的任务。此接口需要执行器服务调用的方法run
public类TellTime实现可运行
{
公开募捐
{
System.out.println(“Now is”+Instant.Now());
}
}
实例化
Runnable task = new TellTime() ;
传给你的遗嘱执行人服务部。其他参数指定在第一次运行之前等待多长时间,以及在第一次运行之后重复执行的频率
ses.scheduleAtFixedRate( task , 0 , 1 , TimeUnit.MINUTES ) ;
确保最终关闭您的executor服务。否则,它的后台线程池可能会无限期地继续,就像僵尸一样,它仍然拥有内部类。只有一种更方便的书写方式。@OleV.V。如果您不想要内部类,您可以将类
TimerTask
扩展为单独的类,然后使用itAs,Timer
/TimerTask
类已被替换。为什么您不想要内部类?
ses.scheduleAtFixedRate( task , 0 , 1 , TimeUnit.MINUTES ) ;