admin管理员组文章数量:1794759
全面解析schedule、scheduleAtFixedRate和scheduleWithFixedDelay
通过java在做定时任务的时候最好使用scheduleThreadPoolExecutor的方式,因为这样可以保证里面始终以后线程是活的。scheduleThreadPoolExecutor有三种任务
执行的方式:
scheduleAtFixedRate(commod,initialDelay,period,unit)
initialDelay是说系统启动后,需要等待多久才开始执行。
period为固定周期时间,按照一定频率来重复执行任务。
如果period设置的是3秒,系统执行要5秒;那么等上一次任务执行完就立即执行,也就是任务与任务之间的差异是5s;
如果period设置的是3s,系统执行要2s;那么需要等到3S后再次执行下一次任务。
public static void main(String[] args) { ScheduledExecutorService respScheduler = new ScheduledThreadPoolExecutor(2); System.out.println("task begin:"+System.currentTimeMillis()/1000); respScheduler.scheduleAtFixedRate(new Runnable() { @Override public void run() { try { Thread.sleep(5000);//2000 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"--task run:"+System.currentTimeMillis()/1000); } },2,3, TimeUnit.SECONDS);}当任务执行耗时为5s时:
task begin:1497945641 pool-1-thread-1--task run:1497945648 pool-1-thread-1--task run:1497945653 pool-1-thread-1--task run:1497945658
pool-1-thread-2--task run:1497945663 当任务执行耗时为2s时
task begin:1497945571 pool-1-thread-1--task run:1497945575 pool-1-thread-1--task run:1497945578
pool-1-thread-1--task run:1497945581
scheduleWithFixedDelay(commod,initialDelay,delay,unit)
initialDelay是说系统启动后,需要等待多久才开始执行。
period为固定周期时间,按照一定频率来重复执行任务。
这个方式必须等待上一个任务结束才开始计时period。
如果设置的period为3s;任务执行耗时为5S那么下次任务执行时间为第8S。
public static void main(String[] args) { ScheduledExecutorService respScheduler = new ScheduledThreadPoolExecutor(2); System.out.println("task begin:"+System.currentTimeMillis()/1000); respScheduler.scheduleWithFixedDelay(new Runnable() { @Override public void run() { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"--task run:"+System.currentTimeMillis()/1000); } },2,3, TimeUnit.SECONDS); }} task begin:1497945822 pool-1-thread-1--task run:1497945829 pool-1-thread-1--task run:1497945837 pool-1-thread-1--task run:1497945845 pool-1-thread-1--task run:1497945853 pool-1-thread-1--task run:1497945861 间隔8Sschedule(commod,initialDelay,unit))比较简单,系统开始initialDelay后开始执行commod任务,执行完完事。
public static void main(String[] args) { ScheduledExecutorService respScheduler = new ScheduledThreadPoolExecutor(2); System.out.println("task begin:"+System.currentTimeMillis()/1000); respScheduler.schedule(new Runnable() { @Override public void run() { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"--task run:"+System.currentTimeMillis()/1000); } },2,TimeUnit.SECONDS); }}task begin:1497946055 pool-1-thread-1--task run:1497946062
如果把上面的任务方式写在一起就和线程池有关系了
public static void main(String[] args) { ScheduledExecutorService respScheduler = new ScheduledThreadPoolExecutor(2); System.out.println("task begin:"+System.currentTimeMillis()/1000); respScheduler.scheduleAtFixedRate(new Runnable() { @Override public void run() { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"--task1 run:"+System.currentTimeMillis()/1000); } },2,3, TimeUnit.SECONDS); System.out.println("main Thread gogogo"); respScheduler.scheduleWithFixedDelay(new Runnable() { @Override public void run() { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"--task2 run:"+System.currentTimeMillis()/1000); } },2,3, TimeUnit.SECONDS); System.out.println("main Thread gogogo222"); respScheduler.schedule(new Runnable() { @Override public void run() { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"--task3 run:"+System.currentTimeMillis()/1000); } },2,TimeUnit.SECONDS); }}
task begin:1497946437 main Thread gogogo main Thread gogogo222 pool-1-thread-2--task1 run:1497946444 pool-1-thread-1--task2 run:1497946444 //线程池两个线程,所以同时执行 pool-1-thread-2--task3 run:1497946449//需要等待其中一个任务执行完,用空的线程才执行task3
pool-1-thread-1--task1 run:1497946449 pool-1-thread-2--task2 run:1497946454//距离上一个task2并不是8s而是10s 是因为没有空余的线程,所以需要多等待一会。 pool-1-thread-1--task1 run:1497946454 pool-1-thread-1--task1 run:1497946459
本文标签: schedulescheduleAtFixedRatescheduleWithFixedDelay
版权声明:本文标题:全面解析schedule、scheduleAtFixedRate和scheduleWithFixedDelay 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686476898a71833.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论