java完全不引人其他框架,自己实现定时任务的方法常用的大概有两种,JDK自带的Timer以及JDK1.5+ 新增的ScheduledExecutorService;
代码如下
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);
}
}
执行结果如下:
通过Timer这个类调度一个java.util.TimerTask任务,在TimerTask编写你的业务逻辑代码。但是现在基本不推荐用这个写法
代码如下:
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()方法,并跟进去代码时发现
Executors.newSingleThreadScheduledExecutor()方法创建的线程池允许创建线程的数量没有做约束,为Integer.MAX_VALUE,这样会导致OOM,所以不推荐这种写法。
在这里延伸下,通过Executors创建线程池的四个方法, 分别是:
newFixedThreadPool(int Threads):创建固定数目的线程池。
newSingleThreadPoolExecutor():创建一个单线程的线程池。
newCacheThreadPool():创建一个可缓存的线程池,调用execute将重用以前构成的线程。
newScheduledThreadPool(int corePoolSize):创建一个支持定时及周期性的任务执行的线程池。
以上的写法都不推荐,原因如下,感兴趣的同学可以跟进源码查看下代码
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);
}
}