java定时任务
timer
1、执行多个任务的时候,必须第一个执行完后才会执行第二个。
2、timer是单线程执行,因此一个任务抛异常,其它任务也不能执行了。
import java.util.Timer;
import java.util.TimerTask;
public class TimerTest
{
private static long start;
public static void main(String[] args) throws Exception
{
TimerTask task1 = new TimerTask()
{
@Override
public void run()
{
System.out.println("task1 invoked ! "
+ (System.currentTimeMillis() - start));
try
{
Thread.sleep(3000);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
};
TimerTask task2 = new TimerTask()
{
@Override
public void run()
{
System.out.println("task2 invoked ! "
+ (System.currentTimeMillis() - start));
}
};
Timer timer = new Timer();
start = System.currentTimeMillis();
timer.schedule(task1, 1000);
timer.schedule(task2, 3000);
}
}
执行结果:
task1 invoked ! 1000
task2 invoked ! 4000
newScheduledThreadPool:
1、可以多个线程同时执行不同的任务。
2、因为是多个线程所有,任务抛出异常,不影响其它任务的执行。
- scheduleAtFixedRate : 0s后开始执行任务,前一次任务的开始时间和下次任务的开始时间中间间隔是5s , 如果前一次任务执行时间大于5s ,那么下次任务会在队列种等待,直到前一次任务执行完后,再执行。
scheduleWithFixedDelay : 0s后开始执行任务,前一次任务的结束时间和后一次任务的开始时间中间间隔是5s。
public class Scheduled { static ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2); static class Task implements Runnable { public void run() { try { Thread.sleep(2000L); System.out.println(Thread.currentThread().getName()); } catch (Exception e) { } } } /** * command:执行线程 * initialDelay:初始化延时 * period:两次开始执行最小间隔时间 * delay:前一次执行结束到下一次执行开始的间隔时间(间隔执行延迟时间) * unit:计时单位 */ public static void main(String[] args) { scheduledExecutorService.scheduleAtFixedRate(new Task(), 0L, 5000L, TimeUnit.MILLISECONDS); scheduledExecutorService.scheduleWithFixedDelay(new Task(), 0L, 5000L, TimeUnit.MILLISECONDS); } }