Timer只有一个线程TimerThread来执行任务,因此同一时刻只有一个TimerTask在执行。因此可以考虑使用ScheduledExecutorService。
public class TimerTest2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
SimpleDateFormat simpleDateFormat =new SimpleDateFormat("HH:mm:ss");
ScheduledExecutorService executorService=Executors.newScheduledThreadPool(3); //申请3个线程池,可同时执行3个任务
Runnable runnable= new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(new SimpleDateFormat("HH:mm:ss").format(new Date()) ); //打印当前时分秒
}
};
Runnable runnable1= new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) ); //打印当前年月日时分秒
}
};
//TimeUnit 表示给定单元粒度的时间段,TimeUnit.SECONDS为以秒为单位
executorService.scheduleAtFixedRate(runnable, 5, 2, TimeUnit.SECONDS);//执行任务1,延迟5秒后开始,间隔2秒执行一次
executorService.scheduleAtFixedRate(runnable1, 2, 2, TimeUnit.SECONDS);//执行任务2,延迟2秒后开始,间隔2秒执行一次
}
}
两个任务同时执行,结果如下图:
schedule方法
- schedule(Runnable command, long delay, TimeUnit unit) 延时任务
- scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) 循环任务,按照上一次任务的发起时间计算下一次任务的开始时间,即 上一个任务的开始时间 + 延迟时间 = 下一个任务的开始时间
- scheduleWithFixedDelay(Runnable command, long initialDelay, long period, TimeUnit unit) 循环任务,以上一次任务的结束时间计算下一次任务的开始时间,即 上一次任务的结束时间 + 延迟时间 = 下一次任务的开始时间
关于TimeUnit unit,参考这篇文章吧