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 ...
随机推荐
- Gym 101246H ``North-East''(LIS)
http://codeforces.com/gym/101246/problem/H 题意: 给出n个点的坐标,现在有一个乐队,他可以从任一点出发,但是只能往右上方走(包括右方和上方),要经过尽量多的 ...
- Maven简单的配置Junit测试及使用简单的mock
1.maven依赖配置如下 <dependency> <groupId>org.mockito</groupId> <artifactId>mockit ...
- python 将一个列表乱序
import random nums = [, , , , , , ] random.shuffle(nums) print(nums)
- Phpstorm Alt+Enter 自动导入类
很方便!!!能够自动提示哪些类没有自动加载!!!然后Alt+Enter进行安装!!!
- bzoj1143: [CTSC2008]祭祀river 最长反链
题意:在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成的网络.每条河道连 ...
- hdu3549网络流之最大流
Ford-Fulkerson方法:dfs实现 dfs 140ms #include<map> #include<set> #include<cmath> #inc ...
- React中父子组件间的通信问题
1.https://blog.csdn.net/sinat_17775997/article/details/59103173 (React中父子组件间的通信问题)
- Leetcode 63
//一维dp还是比较难写的class Solution { public: int uniquePathsWithObstacles(vector<vector<int>>&a ...
- iOS笔记之ScrollView
ScrollView三个基本的要理解的属性: contentSize The size of the content view.所以很好理解,contentSize也就是scrollView可滚动的区 ...
- [批处理]自动修改本机IP地址
前言 抱着笔记本经常到处跑的人,今天回宿舍上网,明天去机房上网,后面去办公室上网,每到一个地方,都要更换一次IP网关掩码 如果都是DHCP还好,关键是为了组织为了方便管理这些地方都是使用的静态IP,所 ...