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

最新文章

  1. JavaScript 写计算器改进版
  2. 使用C#开发数据库应用系统
  3. 软件分析(Mobile Apps )--百词斩
  4. mysql 导出导入数据库
  5. HTTP 方法:GET 对比 POST
  6. hdu 5269 ZYB loves Xor I
  7. BZOJ4607 : [PA2015 Final]Edycja
  8. miniUI datagrid 获取序号
  9. mysql集群之MYSQL CLUSTER
  10. springmvcの神总结のreadme
  11. [Hibernate] - Study test project
  12. div模拟的下拉框特效
  13. [转]HTML accesskey 属性
  14. 加快modelsim仿真速度的方法(原创)
  15. yum笔记
  16. Mysql的执行顺序
  17. HTTP请求中POST与GET的差别
  18. Android Studio和eclipse混淆打包总结
  19. 【viewport】移动设备的兼容性问题
  20. 201521123071 《JAVA程序设计》第二周学习总结

热门文章

  1. LightOJ 1038 Race to 1 Again(概率dp+期望)
  2. codeforces 300 div2 B.Pasha and Phone 容斥原理
  3. PHP 手机号中间4位加密
  4. vim 安装vim-airline
  5. Chain of Responsibility(责任链)
  6. JavaScript--练习1--99乘法表
  7. 远程使用tomcat8的首页的管理工具
  8. C++的const类成员函数
  9. Redis集群搭建笔记
  10. 同时发出 ajax 拿到正确的返回值问题