*(1) Timer延时任务
**缺陷:**1、当一个Timer指定多个TimerTask时,一个TimerTask的延时可能会影响后续TimerTask的运行
- 2、当TimerTask抛出未检查异常,Timer线程将被关闭,同时也可能影响调用线程。
- 3、基于服务器绝对时间(基于绝对时间为什么是缺点??)
public class TimerTest {
public static void main(String[] args) {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("开始第一个任务");
try {
Thread.sleep(5000);
} catch(Exception e) {
e.printStackTrace();
}
if (true) {
//throw new RuntimeException("error"); // 解除注释 程序运行到此处将结束Timer线程,并抛出异常
}
System.out.println("结束第一个任务");
}
}, 1000);
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("开始第二个任务");
try {
Thread.sleep(5000);
} catch(Exception e) {
e.printStackTrace();
}
System.out.println("结束第二个任务");
}
}, 1000);
System.out.println("主线程结束!"); // 因为Timer线程非后台线程,所以主线程执行完毕后jvm不会结束。
}
}
(2)ScheduledThreadPool执行多线程延时任务
/**
* ScheduledThreadPool执行延时任务
* 多线程执行多延时任务
* 单线程执行多延时任务
* @author yfzhangbin
*/
public class SchduleTest {
public static void main(String[] args) {
ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(2);
ScheduledExecutorService singleThread = Executors.newSingleThreadScheduledExecutor();
threadPool.schedule(new MyScheduledTask("t1"), 1, TimeUnit.SECONDS);
threadPool.schedule(new MyScheduledTask("t2"), 1, TimeUnit.SECONDS); // t1、t2在多个线程执行t1延时不会影响t2
singleThread.schedule(new MyScheduledTask("t3"), 1, TimeUnit.SECONDS);
singleThread.schedule(new MyScheduledTask("t4"), 1, TimeUnit.SECONDS); // t3、t4 在同一线程执行t3延时会影响 t4
threadPool.shutdown();
singleThread.shutdown();
}
}
class MyScheduledTask implements Runnable {
private String tname;
public MyScheduledTask(String tname) {
this.tname = tname;
}
@Override
public void run() {
System.out.println(tname+"任务开始执行");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(tname+"任务执行完毕!!!");
}
}