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

ScheduledExecutorService 定时器用法的更多相关文章

  1. Javascript的setTimeOut()和setInterval()的定时器用法

    Javascript用来处理延时和定时任务的setTimeOut和setInterval函数应用非常广泛,它们都用来处理延时和定时任务,比如打开网页一段时间后弹出一个登录框,页面每隔一段时间发送异步请 ...

  2. 【转】IOS NSTimer 定时器用法总结

    原文网址:http://my.oschina.net/u/2340880/blog/398598 NSTimer在IOS开发中会经常用到,尤其是小型游戏,然而对于初学者时常会注意不到其中的内存释放问题 ...

  3. linux定时器用法

    linux定时器  原文出自http://www.cnblogs.com/processakai/archive/2012/04/11/2442294.html 今天看书看到了关于alarm的一些用法 ...

  4. js中setTimeout/setInterval定时器用法示例

    js中setTimeout(定时执行一次)和setInterval(间隔循环执行)用法介绍. setTimeout:在指定的毫秒数后调用指定的代码段或函数:setTimeout示例代码 functio ...

  5. Qt中两种定时器用法

    在Qt中使用定时器有两种方法,一种是使用QObiect类的定时器:一种是使用QTimer类.定时器的精确性依赖于操作系统和硬件,大多数平台支持20ms的精确度. 1.QObject类的定时器 QObj ...

  6. IOS NSTimer 定时器用法总结

    NSTimer在IOS开发中会经常用到,尤其是小型游戏,然而对于初学者时常会注意不到其中的内存释放问题,将其基本用法总结如下: 一.初始化方法:有五种初始化方法,分别是 + (NSTimer *)ti ...

  7. ScheduledExecutorService的用法——定时执行两个任务

    package control; import java.text.DateFormat; import java.text.ParseException; import java.text.Simp ...

  8. java的定时器用法

    java定时器的使用 定时器类Timer在java.util包中.使用时,先实例化,然后使用实例的schedule(TimerTask task, long delay)方法,设定指定的任务task在 ...

  9. C# DateTime简单的定时器用法

    DateTime是C#中的时间类,有公共索引器Now可以获取当前时间. 如果制作简单定时器的话,可以这样: 初始化:DateTime lasttime=DateTime.Now; TimeSpan t ...

随机推荐

  1. session与cookie详解

    session与cookie是什么? session与cookie属于一种会话控制技术.常用在身份识别,登录验证,数据传输等.举个例子,就像我们去超市买东西结账的时候,我们要拿出我们的会员卡才会获取优 ...

  2. 谈谈刚接触sea.js框架得看法

    向大神致敬,也是我接触框架得开始. 感谢张鑫旭大神,专业!致敬~   sea.js的7个API,都在下面得链接中有详细说明: http://www.zhangxinxu.com/sp/seajs/do ...

  3. 这些HTML、CSS知识点,面试和平时开发都需要 No1-No4(知识点:HTML、CSS、盒子模型、内容布局)

    这些HTML.CSS知识点,面试和平时开发都需要 No1-No4   系列知识点汇总 这些HTML.CSS知识点,面试和平时开发都需要 No1-No4(知识点:HTML.CSS.盒子模型.内容布局) ...

  4. 2018-2019-2《网络对抗技术》Exp0 Kali安装 Week1

    2018-2019-2<网络对抗技术>Exp0 Kali安装 Week1 Kali的安装 设置虚拟机的名称和操作系统 为虚拟机分配虚拟内存,大小为4096M,分配存储空间,大小为25.0G ...

  5. windows使用git记录

    1.免密码clone远程服务器代码开启ssh 生成私钥公钥 命令:查看自己配置的邮箱 git config user.name git config user.email 生成密钥:邮箱填写上面查看出 ...

  6. call()与apply()用法

    call()和apply()的作用都是一样的——通过改变函数体内部 this 的指向,借用对象的方法的目的 还是举个栗子吧: function Cat(){ this.food = 'fish'; t ...

  7. zoj2314

    题解: 有上限的网络流 基本模板 代码: #include<bits/stdc++.h> using namespace std; ; int ne[N],num,n,m,d[N],S,T ...

  8. Android Studio 编译报错:Process 'command 'D:\SDK\AS\sdk\build-tools\23.0.0\aapt.exe'' finished with non-zero exit value 1

    AGPBI: {"kind":"error","text":"No resource identifier found for a ...

  9. 利用DotNetZip服务端压缩文件并下载

    public void DownFile() {              string filePath = Server.MapPath("/Files/txt/bb.txt" ...

  10. 怎样使用visio画数据库模型图

    怎样使用visio画数据库模型图     计算机专业的学生在做程序的需求分析文档或者毕业设计的时候,针对自己开发的系统,肯定少不了要画数据库的模型图.许多同学喜欢用word实现,当然,word可以满足 ...