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() ; }
}
ScheduledExecutorService 定时器用法的更多相关文章
- Javascript的setTimeOut()和setInterval()的定时器用法
Javascript用来处理延时和定时任务的setTimeOut和setInterval函数应用非常广泛,它们都用来处理延时和定时任务,比如打开网页一段时间后弹出一个登录框,页面每隔一段时间发送异步请 ...
- 【转】IOS NSTimer 定时器用法总结
原文网址:http://my.oschina.net/u/2340880/blog/398598 NSTimer在IOS开发中会经常用到,尤其是小型游戏,然而对于初学者时常会注意不到其中的内存释放问题 ...
- linux定时器用法
linux定时器 原文出自http://www.cnblogs.com/processakai/archive/2012/04/11/2442294.html 今天看书看到了关于alarm的一些用法 ...
- js中setTimeout/setInterval定时器用法示例
js中setTimeout(定时执行一次)和setInterval(间隔循环执行)用法介绍. setTimeout:在指定的毫秒数后调用指定的代码段或函数:setTimeout示例代码 functio ...
- Qt中两种定时器用法
在Qt中使用定时器有两种方法,一种是使用QObiect类的定时器:一种是使用QTimer类.定时器的精确性依赖于操作系统和硬件,大多数平台支持20ms的精确度. 1.QObject类的定时器 QObj ...
- IOS NSTimer 定时器用法总结
NSTimer在IOS开发中会经常用到,尤其是小型游戏,然而对于初学者时常会注意不到其中的内存释放问题,将其基本用法总结如下: 一.初始化方法:有五种初始化方法,分别是 + (NSTimer *)ti ...
- ScheduledExecutorService的用法——定时执行两个任务
package control; import java.text.DateFormat; import java.text.ParseException; import java.text.Simp ...
- java的定时器用法
java定时器的使用 定时器类Timer在java.util包中.使用时,先实例化,然后使用实例的schedule(TimerTask task, long delay)方法,设定指定的任务task在 ...
- C# DateTime简单的定时器用法
DateTime是C#中的时间类,有公共索引器Now可以获取当前时间. 如果制作简单定时器的话,可以这样: 初始化:DateTime lasttime=DateTime.Now; TimeSpan t ...
随机推荐
- C++ 自定义错误类
#include <iostream> #include <exception> using namespace std; struct MyException : publi ...
- ZOJ 2314 Reactor Cooling(无源汇上下界网络流)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2314 题意: 给出每条边流量的上下界,问是否存在可行流,如果存在则输出. ...
- 解决QML Window 增加radius效果
做开发时,突然遇到 一个需要模态展示的对话框,做出来后,发现还要radius属性,增加时发现,Window控件不支持这个属性.如果是以前,原本就打算放弃了,但想一下,这种应该是支持的,既然接口上没有, ...
- xtu 1242 Yada Number 容斥原理
Yada Number Problem Description: Every positive integer can be expressed by multiplication of prime ...
- HDU-1532 Drainage Ditches (最大流,EK算法模板)
题目大意:最大流的模板题...源点是0,汇点是n-1. 代码如下: # include<iostream> # include<cstdio> # include<cma ...
- mysqli使用记录
1.批量插入数据insert 方式一:insert into tableName (id,name,age) values ('1','张三','12'),('2','李四','16'),('3',' ...
- python自动化运维之路2
list列表 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 #!/usr/bin/env python # _*_ encoding:utf-8 _*_ # a ...
- Linux jdk环境配置模板
export JAVA_HOME=/opt/JAVA/jdk1.8.0_191export JRE_HOME=${JAVA_HOME}/jreexport CLASSPATH=.:${JAVA_HOM ...
- Struts2基本使用(一)--在项目中引入Struts2
Struts2基本使用 在MVC开发模式中,Struts2充当控制器(Controller)的角色.其主要功能就是处理用户请求,生成响应,是连接视图层(View)和模型层(Model)的桥梁.在处理用 ...
- .properties文件常量定义
application.properties文件,位于resources目录下.一般定义一些不会改变的数据如数据库相关配置,文件路径,项目地址. 如何在项目代码中获取该文件中的配置信息: 1,在app ...