public class TestController {
public static void main(String[] args) {
Timer t = new Timer();//任务启动
for (int i = 0; i < 2; i++) {
TimerTask timerTask = new FooTimerTask("foo" + i);
t.schedule(timerTask, new Date(), 2000);//任务添加
//schedule 真正的执行时间 取决上一个任务的结束时间 ExecutTime (存在丢任务,少执行了的可能)
//scheduleAtFixedRate 严格按照预设时间执行 (执行时间会乱)
//ps: 原因 是因为 run() 用了单线程执行,存在任务阻塞,任务超时 需要使用线程池
}
}
}
class FooTimerTask extends TimerTask {
private String name;
public FooTimerTask(String name) {
this.name = name;
}
public void run() {
try {
System.out.println("name=" + name + "开始时间=" + new Date());
Thread.sleep(3000);
System.out.println("name=" + name + "结束时间=" + new Date());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
线程池的方式
public class ScheduleThreadPoolTest {
public static void main(String[] args) {
ScheduledExecutorService scheduleThreadPool= Executors.newScheduledThreadPool(5);
for(int i=0;i<2;i++){
// 一定延时之后只执行一次任务
scheduleThreadPool.schedule(new Task("task"+i),2, TimeUnit.SECONDS);
//一定延时之后周期性的执行任务
//间隔是固定的无论上一个任务是否执行完成
//scheduleThreadPool.scheduleWithFixedDelay(new Task("task"+i),0,2, TimeUnit.SECONDS);
// scheduleThreadPool.scheduleAtFixedRate(new Task("task"+i),0,2, TimeUnit.SECONDS);
//间隔是不固定的,会在周期任务的上一个任务执行完成之后才开始计时,并在指定时间间隔之后才开始执行任务
}
}
}
class Task implements Runnable {
private String name;
public Task(String name){
this.name=name;
}
public void run() {
try {
System.out.println("name="+name+"开始时间="+new Date());
Thread.sleep(3000);
System.out.println("name="+name+"结束时间="+new Date());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}