最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

Timer延时任务和ScheduledThreadPool执行延时任务

互联网 admin 5浏览 0评论

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+"任务执行完毕!!!");  }  }  
发布评论

评论列表 (0)

  1. 暂无评论