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