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() ;

   }
}
原文地址:https://www.cnblogs.com/junrong624/p/5504711.html