java通过ScheduledExecutorService实现定时任务

一、java实现定时任务的方式

java完全不引人其他框架,自己实现定时任务的方法常用的大概有两种,JDK自带的Timer以及JDK1.5+ 新增的ScheduledExecutorService; 

二、Timer方式实现

代码如下

import java.util.Timer;
import java.util.TimerTask;
public class TestA {
public static void main(String[] args) {

    TimerTask task = new TimerTask(){

        @Override
        public void run() {
            System.out.println(System.currentTimeMillis()+"...hello");
        }
    };
    Timer timer = new Timer();
    //延迟执行时间(毫秒)
    long delay = 0;
    //执行的时间间隔(毫秒)
    long period = 1*500;
    timer.scheduleAtFixedRate(task, delay, period);
}

}

执行结果如下:

java通过ScheduledExecutorService实现定时任务_第1张图片

通过Timer这个类调度一个java.util.TimerTask任务,在TimerTask编写你的业务逻辑代码。但是现在基本不推荐用这个写法

三、ScheduledExecutorService 接口实现类 

代码如下:

public class TimerTest2 {

    public static void main(String[] args) {
        Runnable runable = new Runnable(){

            public void run() {
                System.out.println(System.currentTimeMillis()+"...hello");
            }
        };
        long delay = 0;  //延迟执行时间(秒)
        long period = 5; //执行的时间间隔(秒)
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        service.scheduleAtFixedRate(runable, delay, period, TimeUnit.SECONDS);
    }
}

通过调用ScheduledExecutorService的scheduleAtFixedRate方法来实现定时任务

runable的这个参数,也可以自己新建一个类,只要实现Runnable 即可,如下:

scheduExec.scheduleAtFixedRate(new SyTemplates(), 60, delay, TimeUnit.SECONDS);

然后在自己新建的类里面写业务逻辑实现。

但是当你把

ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();

service.scheduleAtFixedRate(runable, delay, period, TimeUnit.SECONDS);

这段代码拷贝到你的编辑器时候,如果你安装了阿里规约,编辑器会提示你,推荐手动新建线程池,下面来解释下为什么不推荐这种写法,以及符合阿里规约的写法

当我们进入到Executors实现类,并查看newSingleThreadScheduledExecutor()方法,并跟进去代码时发现

 

java通过ScheduledExecutorService实现定时任务_第2张图片

java通过ScheduledExecutorService实现定时任务_第3张图片

Executors.newSingleThreadScheduledExecutor()方法创建的线程池允许创建线程的数量没有做约束,为Integer.MAX_VALUE,这样会导致OOM,所以不推荐这种写法。

在这里延伸下,通过Executors创建线程池的四个方法, 分别是:

newFixedThreadPool(int Threads):创建固定数目的线程池。

newSingleThreadPoolExecutor():创建一个单线程的线程池。

newCacheThreadPool():创建一个可缓存的线程池,调用execute将重用以前构成的线程。

newScheduledThreadPool(int corePoolSize):创建一个支持定时及周期性的任务执行的线程池。

以上的写法都不推荐,原因如下,感兴趣的同学可以跟进源码查看下代码

java通过ScheduledExecutorService实现定时任务_第4张图片

四、符合阿里规约的写法

public class TimerTest2 {

    public static void main(String[] args) {
        Runnable runable = new Runnable(){

            public void run() {
                System.out.println(System.currentTimeMillis()+"...hello");
            }
        };
        //延迟执行时间(秒)
        long delay = 0;
        //执行的时间间隔(秒)
        long period = 5;
        ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("thread-call-runner-%d").build();
        ScheduledExecutorService scheduExec = new ScheduledThreadPoolExecutor(1,namedThreadFactory);
        service.scheduleAtFixedRate(runable, delay, period, TimeUnit.SECONDS);
    }
}

你可能感兴趣的:(工作总结)