Java并发编程——线程池的使用(五)延时执行的线程池ScheduledExecutorService
来源:互联网 发布:京宽网络24客服电话 编辑:程序博客网 时间:2024/06/05 10:28
一、ScheduledExecutorService的延时执行功能
ScheduledExecutorService是延时执行的线程池,推荐用ScheduledExecutorService代替timer定时器。
创建一个ScheduledExecutorService很简单
ScheduledExecutorService service = Executors.newScheduledThreadPool(num);
延时n秒执行:
//延时n秒执行service.schedule(Runnable, n, TimeUnit.SECONDS);service.schedule(Callable, n, TimeUnit.SECONDS);
栗子:
public static void main(String[] args) { ScheduledExecutorService service = Executors.newScheduledThreadPool(3); System.out.println("开始任务"); //延时3秒执行 service.schedule(new Runnable() { @Override public void run() { System.out.println("执行任务"); } }, 3, TimeUnit.SECONDS); }
log:
12-25 16:46:12.700 30954-30954/lbx.myapplication I/System.out: 开始任务12-25 16:46:15.710 30954-31120/lbx.myapplication I/System.out: 执行任务
看下log的时间,可以发现,Runnable里的代码是在3秒后执行的。
二、ScheduledExecutorService的循环执行功能
//循环执行任务,首先延时m秒执行,n秒循环一次service.scheduleAtFixedRate(Runnable, m, n, TimeUnit.SECONDS);
栗子:
public static void main(String[] args) { ScheduledExecutorService service = Executors.newScheduledThreadPool(3); System.out.println("开始任务"); //延时3秒执行,每1秒执行一次 service.scheduleAtFixedRate(new Runnable() { @Override public void run() { System.out.println("执行任务"); } }, 3, 1, TimeUnit.SECONDS); }
log:
12-25 16:49:56.000 7698-7698/lbx.myapplication I/System.out: 开始任务12-25 16:49:59.000 7698-7847/lbx.myapplication I/System.out: 执行任务12-25 16:50:00.000 7698-7847/lbx.myapplication I/System.out: 执行任务12-25 16:50:01.000 7698-8406/lbx.myapplication I/System.out: 执行任务12-25 16:50:02.000 7698-8406/lbx.myapplication I/System.out: 执行任务12-25 16:50:03.000 7698-8406/lbx.myapplication I/System.out: 执行任务12-25 16:50:04.000 7698-8406/lbx.myapplication I/System.out: 执行任务
可以发现,刚开始演示了三秒,后续每1秒执行了一次Runnable里的代码逻辑。
三、ScheduledThreadPoolExecutor的使用
ScheduledThreadPoolExecutor是ScheduledExecutorService的子类,
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(num);
它有以下常用的方法:
//获取未完成的任务队列executor.getQueue();//移除任务队列中的任务 future = executor.scheduleAtFixedRate/scheduleWithFixedDelayexecutor.remove((Runnable) future);//取消任务队列中的schedule任务,但不会在队列中删除,即getQueue的数量不会减1,executor.setRemoveOnCancelPolicy(true)的时候减1boolean cancel = future.cancel(true);//schedule任务是否取消future.isCancelled()//延时的schedule在shutdown后,不会继续执行没到时间的任务,默认是true,会执行一次正在倒计时的任务再结束executor.setExecuteExistingDelayedTasksAfterShutdownPolicy(false);//延时的scheduleAtFixedRate/scheduleWithFixedDelay在shutdown后,不会继续执行没到时间的任务,默认是true,会执行一次正在倒计时的任务再结束executor.setContinueExistingPeriodicTasksAfterShutdownPolicy(false);
阅读全文