zoukankan      html  css  js  c++  java
  • ScheduledExecutorService 定时器用法

    1,如果只是想简单的写个定时任务,比如10分钟跑一次,那么ScheduledExecutorService是比较方便的,下面举个简单的例子

      

    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.ScheduledFuture;
    import java.util.concurrent.TimeUnit;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class CrawlerRun {
       private static final Logger logger = LoggerFactory.getLogger(CrawlerRun.class);
       public static void main(String[] args) {
          ScheduledExecutorService service = Executors.newScheduledThreadPool(8);//先定义8个线程空间
          final ScheduledFuture<?> future = service.scheduleAtFixedRate(new CrawlerTest(), 0,10,
                     TimeUnit.MINUTES);//CrawlerTest()是一个实现Runnable接口的类,会自动运行里面的run()方法,0的意思就是启动等待时间,这里就是直接运行,
    10是10分钟,要是想小时,就把TimeUnit.MINUTES换成 TimeUnit.HOURS
    //使用1个线程 Thread t= new Thread(new Runnable() { public void run() { try { future.get(); } catch (Exception e) { logger.error(e.getCause().getMessage(), e.getCause());//日志信息输出 future.cancel(false);//关闭线程 } } }); t.start() ; } }

     2,如果想早上8点到晚上8点采集(期间还是10分钟跑一次),别的时间不采集,那就要在CrawlerTest()里面run()方法做判断

        

    import java.util.Calendar;
    
    public void run() {
            try {
                Calendar ca=Calendar.getInstance();
                int hour = ca.get(Calendar.HOUR_OF_DAY) ;//获取当时时间数    
                if(hour <8 || hour >20) return ;
                this.Crawler2();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            
        }

    3,如果想指定就8点,12点,16点,20点采集,别的时间都不采集,那就要加判断

        

    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.ScheduledFuture;
    import java.util.concurrent.TimeUnit;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class CrawlerRun {
       private static final Logger logger = LoggerFactory.getLogger(CrawlerRun.class);
    
       private static long delayTime(long currentTime , String campareDateStr) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = new Date() ; 
            
            String str = TimeFormat.getYearMonthDate();
            str = str.replaceAll("00:00:00", campareDateStr) ;
            try {
                date = sdf.parse(str) ;
            } catch (ParseException e1) {
                e1.printStackTrace();
            }
            long dateMillis = date.getTime() ;
            
            return dateMillis - currentTime ;
            
            
        }
       public static void main(String[] args) {
            long currentTime = System.currentTimeMillis() ;
            long realDelayTime = 0 ;
            long delayTime = CrawlerRun.delayTime(currentTime, "08:00:00") ;
            long delayTime2= CrawlerRun.delayTime(currentTime, "12:00:00") ;
            long delayTime3= CrawlerRun.delayTime(currentTime, "16:00:00") ;
            long delayTime4= CrawlerRun.delayTime(currentTime, "20:00:00") ;
            
            List<Long> list = new ArrayList<Long>() ;
            
            list.add(delayTime) ;
            list.add(delayTime2) ;
            list.add(delayTime3) ;
            list.add(delayTime4) ;
            
            Collections.sort(list);
            
            
            for (Long time : list) {
                if(time < 0 ) continue ; 
                else{ 
                    realDelayTime = time;
                    break;
                    }
            }
            
          ScheduledExecutorService service = Executors.newScheduledThreadPool(8);//先定义8个线程空间
         final ScheduledFuture<?> future = service.scheduleAtFixedRate(new CrawlerTest(), realDelayTime/1000, 4*60*60,
                     TimeUnit.SECONDS);
    
          //使用1个线程
             Thread t= new Thread(new Runnable() {
                    public void run() {
                        try {
                            future.get();
                        } catch (Exception e) {
                            logger.error(e.getCause().getMessage(), e.getCause());//日志信息输出
                            future.cancel(false);//关闭线程
                        }
                    }
            });
            t.start() ;
    
       }
    }
  • 相关阅读:
    yolov3计算mAP
    ESP32 ADC的坑
    DCNv2编译过程报错:error: identifier "THCudaBlas_SgemmBatched" is undefined
    Arduino在Lib中输出调试参数
    ESP32获取WT901CTTL/232四元数
    常用公共前端CDN库
    js / php 网站底部版权文字自动改变年份
    以管理员身份在当前目录打开命令行窗口
    【JavaScript】提取字符串里的分数,及计算平均分并与平均分比较输出
    添加谷歌翻译到你的网站
  • 原文地址:https://www.cnblogs.com/junrong624/p/5504711.html
Copyright © 2011-2022 走看看