• 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() ;
    
       }
    }
  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    数据库作业5:SQL练习2
    数据库作业4:SQL练习1
    Linux的cp复制和mv移动命令的超详细介绍
    python数组添加整行或整列
    CentOS7下安装tomcat的超详细说明
  • 原文地址:https://www.cnblogs.com/junrong624/p/5504711.html
Copyright © 2020-2023  润新知