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. python assert 断言详细用法格式

    使用assert断言是学习python一个非常好的习惯,python assert 断言句语格式及用法很简单.在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件 ...

  2. 使用quartz实现定时器功能

    首先导入两个包 <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>qua ...

  3. 【Python】实现对大文件的增量读取

    背景 前段时间在做一个算法测试,需要对源于日志的数据进行分析才能获取到结果:日志文件较大,所以想要获取数据的变化曲线,增量读取是最好的方式. 网上有很多人的技术博客都是写的用for循环readline ...

  4. Tensorflow一些常用基本概念与函数(三)

    摘要:本系列主要对tf的一些常用概念与方法进行描述.本文主要针对tensorflow的数据IO.图的运行等相关函数进行讲解.为‘Tensorflow一些常用基本概念与函数’系列之三. 1.序言 本文所 ...

  5. [Checking for libstdc++-4.4.4-13.el6-i686; Not found. Failed] 的解决。

    单纯 yum install libstdc++-4.4.4.i686 是不行的. 应该安装 yum install libstdc++-devel.i686 顺带就能装上需要的lib 真够变态的. ...

  6. HDU - 4804 Campus Design 轮廓线dp

    题意:一个nm的矩阵被12的骨牌和11的骨牌完全覆盖,11的骨牌只能放c-d次,矩阵中有障碍物 题解:dp[i][j][k]表示到了第i行,第j个状态,放过k个11的骨牌,当前位有障碍物时只有一种转移 ...

  7. 基于Oracle的SQL优化(崔华著)-整理笔记-第5章“Oracle里的统计信息”

    第5章“Oracle里的统计信息” 详细介绍了Oracle数据库里与统计信息相关的各个方面的内容,包括 Oracle数据库中各种统计信息的分类.含义.收集和查看方法,以及如何在Oracle数据库里正确 ...

  8. 前端工程构建工具——Yeoman

    一.Yeoman 简介 通常在开发新项目时我们都需要配置工程环境,开发目录,需要下载一些库.框架文件(如 jQuery.Backbone 等),配置编译环境(Less.Sass.Coffeescrip ...

  9. 【MVC】MusicStore相关资料

    引言 当你对MVC的项目结构有一定了解时,那就可以开始学习一个世界级的MVC入门demo--MusicStore.学习的绝招就是把它抄一遍. 相关资料 MVC Music Store  Codeple ...

  10. SSH使用主机名访问

    比如说A电脑已经和B电脑实现了ssh免密码登陆!但是A电脑通过 ssh B电脑的主机名称 不行! 解决办法: 01.修改A电脑中的hosts文件    vim /etc/hosts 02.进入编辑界面 ...