• 使用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 }
  • 相关阅读:
    分布式服务框架 Zookeeper — 管理分布式环境中的数据
    分布式消息队列(二)
    分布式消息队列(一)
    数据库事务的四大特性以及事务的隔离级别
    php--yii2.0的安装
    php--字符串函数分类总结
    一张表有三个字段:id(城市id) Cityname(城市名) Privence(所属省份)如果要统计每个省份有多少城市请用SQL实现。
    TP自带的缓存机制
    php——n维数组的遍历——递归
    php--分享插件
  • 原文地址:https://www.cnblogs.com/fpqi/p/9720014.html
Copyright © 2020-2023  润新知