• 使用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 }
  • 相关阅读:
    USACO 2017 US Open Contest Gold T1: Bovine Genomics
    自己瞎调的一些曲子
    NOIP前要干的一些事
    【[BJOI2018]链上二次求和】
    【MdOI2020】Path
    【[SDOI2018]旧试题】
    [IOI2018]werewolf狼人
    洛谷p5444 [APIO2019]奇怪装置
    洛谷p4211 [LNOI2014] LCA
    洛谷P2805 [NOI2009] 植物大战僵尸
  • 原文地址:https://www.cnblogs.com/fpqi/p/9720014.html
Copyright © 2020-2023  润新知