使用ScheduledThreadPoolExecutor执行定时任务
Posted fpqi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用ScheduledThreadPoolExecutor执行定时任务相关的知识,希望对你有一定的参考价值。
ScheduledThreadPoolExecutor scheduled = new ScheduledThreadPoolExecutor(2); scheduled.scheduleAtFixedRate(new Runnable() { @Override public void run() { System.out.println("time:"); } }, 0, 40, TimeUnit.MILLISECONDS);//0表示首次执行任务的延迟时间,40表示每次执行任务的间隔时间,TimeUnit.MILLISECONDS执行的时间间隔数值单位
间隔单位毫秒:TimeUnit.MILLISECONDS
间隔单位秒:TimeUnit.SECONDS
间隔单位分钟:TimeUnit.MINUTES
间隔单位小时:TimeUnit.HOURS
间隔单位天:TimeUnit.DAYS
其中Runnable里面可以通过一个类实现Runnable接口,具体见
使用ThreadPoolExecutor进行多线程编程
一旦程序启动将无限制执行下去,实际中可以通过限制定时任务的次数或者时间来终止程序的执行。
1,限制程序执行的时间:scheduled.awaitTermination(100,TimeUnit.SECONDS); 这句话表明100毫秒后程序终止。
2,限制程序执行的次数:如果是单线程,那么可以直接定义一个静态变量count,每执行一次,count加一,如果count大于某个值就调用shutdown或者shutdownNow函数;如果是多线程,稍微要复杂一点,但是原理也是一样的。定义一个静态变量count,没执行一个也是count加一,只不过在执行加一操作之前需要加锁,执行完之后需要解锁。
1 public class ScheduledMultiThreadTool { 2 private static Integer count =1; 3 MyTimereTask myTimereTask = new MyTimereTask(); 4 private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); 5 ScheduledExecutorService scheduled =Executors.newScheduledThreadPool(2); 6 7 public void start(){ 8 try { 9 scheduled.scheduleWithFixedDelay(myTimereTask, 0,1, TimeUnit.SECONDS); 10 scheduled.scheduleWithFixedDelay(myTimereTask, 0,1, TimeUnit.SECONDS); 11 scheduled.scheduleWithFixedDelay(myTimereTask, 0,1, TimeUnit.SECONDS); 12 scheduled.scheduleWithFixedDelay(myTimereTask, 0,1, TimeUnit.SECONDS); 13 while (!scheduled.isTerminated()){ 14 lock.readLock().lock(); 15 if (count >20){ 16 scheduled.shutdown(); 17 } 18 lock.readLock().unlock(); 19 20 } 21 }catch(Exception e){ 22 e.printStackTrace(); 23 } 24 System.out.println("Finished all threads"); 25 } 26 private class MyTimereTask implements Runnable { 27 @Override 28 public void run(){ 29 lock.writeLock().lock(); 30 System.out.println("第 "+count+ " 次执行任务,count="+count); 31 count ++; 32 lock.writeLock().unlock(); 33 } 34 35 } 36 }
以上是关于使用ScheduledThreadPoolExecutor执行定时任务的主要内容,如果未能解决你的问题,请参考以下文章
在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?
Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)