无内部类的java计时器功能

uinbv5nw  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(471)

我在代码中实现了以下计时器功能

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方法,我想知道是否有其他有效的方法来编写计时器逻辑,或者这是我们处理计时器的唯一方法。

svmlkihl

svmlkihl1#

热释光;博士

你要求:
无内部类的java计时器功能
将任务定义为一个单独的类 Runnable 接口,示例提交给 ScheduledExecutorService 对象。
你会被反复处决,而不涉及内部阶级。

使用执行器服务

正如javadoc中提到的 Timer / TimerTask 类已被添加到Java5中的executors框架所取代。请参见oracle的教程。
从获取executor服务对象 Executors 班级。要安排重复任务,请获取 ScheduledExecutorService .

ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor() ;

定义实现runnable的独立类

提交要作为类型的对象执行的任务 Runnable . 此接口需要一个方法 run 执行人服务部称之为。

public class TellTime implements Runnable
{
    public void run()
    {
        System.out.println( "Now is " + Instant.now() ) ;
    }
}

示例化。

Runnable task = new TellTime() ;

传给你的遗嘱执行人。其他参数指定第一次运行之前要等待多长时间,然后指定之后重复执行的频率。

ses.scheduleAtFixedRate( task , 0 , 1 , TimeUnit.MINUTES ) ;

最后一定要关闭你的执行服务。否则它的后台线程池可能会无限期地继续,就像僵尸一样?‍♂️.

xpszyzbs

xpszyzbs2#

如果您使用的是java 8,则可以简化代码:

import java.util.Timer;
..

Timer timer = new Timer();
timer.schedule(() -> doSomething(), 60000);

相关问题