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

   }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM