Timer延时任务和ScheduledThreadPool执行延时任务
*(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() {@Overridepublic 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() {@Overridepublic 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+"任务执行完毕!!!"); } }
Timer延时任务和ScheduledThreadPool执行延时任务
*(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() {@Overridepublic 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() {@Overridepublic 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+"任务执行完毕!!!"); } }