Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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_Timer_Timertask - Fatal编程技术网

没有内部类的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 ) ;