[quote][size=small] 一直在做JAVA采集程序,积累了自己JAVA采集API。在采集过程中,常常使用到定时器,在JAVA的API中有Timer和TimerTask两个类做定时器。精确度那可以肯定的,对周期性运行的程序定时效果很好。但是有个不好使用的地方就是不能直接设置在某个时刻运行,或在某几个时刻运行。为此参考了那两个类的写法,编写了一个自己定时器,也叫Timer和TimerTask还有个测试类TimerTest,用到的DateUtil类在附件中。这个定时器具备周期性定时(毫秒级);单时刻定时(秒级);多时刻定时(秒级)。后两个时间的设置必须符合“yyyy-MM-dd HH:mm:ss”、“yyyy-MM-dd ”、“HH:mm:ss”、“HH:mm”、“yyyy-MM-dd HH”、“yyyy-MM-dd HH:mm”格式。它们源码如下,敬请大家指教。[/size][/quote]
//TimerTask代码
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
public abstract class TimerTask implements Runnable {
private long period=-1;
private String time;
private List<String> timeList;
private boolean isCancel=false;
private boolean isFormart = false;
public long getPeriod() {
return period;
}
public void setPeriod(long period) {
this.period = period;
}
public void setTime(String time) {
this.time = time;
}
public String getTime() {
return time;
}
public List<String> getTimeList() {
return timeList;
}
public void setTimeList(List<String> timeList) {
this.timeList = timeList;
}
public void cancel() {
this.isCancel = true;
}
public boolean isCancel() {
return isCancel;
}
public abstract void execute();
public void run() {
//格式化传入的日期或日期时间或时间参数
if(!this.isFormart){
this.fomart();
}
//确保指定的运行点在一秒钟内只运行一次
boolean isRun=false;
//确保多个运行点中,每个运行点在一秒钟内只运行一次
int flag[]=null;
try {
flag=new int[this.timeList.size()];
} catch (Exception e) {
}
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//当没有被取消时
while(!isCancel){
String dt=sdf.format(new Date());
if(this.period>0){
try {
Thread.sleep(this.period);
} catch (Exception e) {
}
this.execute();
}
else if (this.time != null) {
if(this.time.indexOf("-")>0){
if(this.time.equals(dt) && !isRun){
isRun=true;
this.execute();
}
}
else{
if(this.time.equals(dt.substring(11)) && !isRun){
isRun=true;
this.execute();
}
}
}
else if(this.timeList!=null){
int loopIndex=0;
for (String dateTime : this.timeList) {
if(dateTime.indexOf("-")>0){
if(dateTime.equals(dt) && flag[loopIndex]==0){
this.execute();
flag[loopIndex]=1;
}
}
else{
if(dateTime.equals(dt.substring(11)) && flag[loopIndex]==0){
this.execute();
flag[loopIndex]=1;
}
}
++loopIndex;
}
}
}
}
private void fomart(){
if(!this.isFormart){
if(this.time!=null){
this.time=this.format(this.time);
}
if(this.timeList!=null){
for (int i=0;i<this.timeList.size();i++) {
String dateTime=this.timeList.get(i);
if(dateTime!=null){
this.timeList.set(i, format(dateTime));
}
}
}
}
else{
this.isFormart=true;
}
}
private String format(String datetime) {
if (datetime != null) {
// 是否含有减号
boolean hasSubtrSign = datetime.contains("-");
// 是否含有冒号
boolean hasColonSign = datetime.contains(":");
// 12-23 12:33
if (hasSubtrSign == true && hasColonSign == true) {
datetime = DateUtil.formatToEnglish(datetime);
} else if (hasSubtrSign && hasColonSign == false) {
datetime = DateUtil.formatToEnglish(datetime);
} else if (hasSubtrSign == false && hasColonSign) {
datetime = DateUtil.formatToEnglish(datetime).substring(11);
}
}
return datetime;
}
}
///
//Timer代码
import java.util.ArrayList;
public class Timer extends Thread{
private boolean isStart=false;
private boolean isCannel=false;
ArrayList<TimerTaskBean> tasks=new ArrayList<TimerTaskBean>();
public Timer() {
}
public void cancel(){
this.isCannel=true;
}
public boolean isCannel() {
return isCannel;
}
public void schedule(TimerTask task, long period) {
task.setPeriod(period);
//添加任务
this.addTask(task);
}
public void schedule(TimerTask task, long delay, long period){
try {
Thread.sleep(delay);
} catch (Exception e) {
}
task.setPeriod(period);
//添加任务
this.addTask(task);
}
public void schedule(TimerTask task, String time) {
task.setTime(time);
//添加任务
this.addTask(task);
}
public void schedule(TimerTask task, long delay, String time) {
try {
Thread.sleep(delay);
} catch (Exception e) {
}
task.setTime(time);
//添加任务
this.addTask(task);
}
public void schedule(TimerTask task, java.util.List<String> timeList) {
task.setTimeList(timeList);
//添加任务
this.addTask(task);
}
public void schedule(TimerTask task, long delay, java.util.List<String> timeList) {
try {
Thread.sleep(delay);
} catch (Exception e) {
}
task.setTimeList(timeList);
//添加任务
this.addTask(task);
}
//添加任务
private void addTask(TimerTask task){
boolean isExist=false;
for (TimerTaskBean ttBean : this.tasks) {
if(task.equals(ttBean.getTask())){
isExist=true;
break;
}
else{
isExist=false;
}
}
if(!isExist){
tasks.add(new TimerTaskBean(task,false));
}
//判断定时器线程是否启动
if(!this.isStart){
this.start();
this.isStart=true;
}
}
public void run(){
// 是否取消所有任务的定时功能
while (!this.isCannel) {
for (int i=0;i<tasks.size();i++) {
TimerTaskBean ttBean = tasks.get(i);
//判断是否开始运行
if(ttBean!=null &&!ttBean.isRun()){
ttBean.setRun(true);
new Thread(ttBean.getTask()).start();
}
}
}
//当取消定时器时,取消所有任务
if(this.isCannel){
for (TimerTaskBean ttBean : tasks) {
ttBean.getTask().cancel();
}
}
}
class TimerTaskBean {
public TimerTaskBean() {
}
public TimerTaskBean(TimerTask task,boolean isRun) {
this.task=task;
this.isRun=isRun;
}
private boolean isRun = false;
private TimerTask task = null;
public boolean isRun() {
return isRun;
}
public void setRun(boolean isRun) {
this.isRun = isRun;
}
public TimerTask getTask() {
return task;
}
public void setTask(TimerTask task) {
this.task = task;
}
}
}
//TimerTest代码
import java.util.ArrayList;
public class TimerTest {
public static void main(String[] args) {
Timer t = new Timer();
T1 t1 = new T1();
T2 t2 = new T2();
t.schedule(t1, 1000);
ArrayList<String> list = new ArrayList<String>();
list.add("11:44:30");
list.add("11:44:31");
list.add("11:44:32");
list.add("11:44:33");
list.add("11:44:34");
list.add("11:44:35");
list.add("11:44:36");
list.add("11:44:37");
t.schedule(t1, list);
try {
Thread.sleep(1000*4);
} catch (Exception e) {
}
t1.cancel();//取消任务1,任务2线程停止
t.schedule(t2, 1000);
t.schedule(t2, list);
try {
Thread.sleep(1000*4);
} catch (Exception e) {
}
t2.cancel();//取消任务2,任务2线程停止
try {
Thread.sleep(1000*4);
} catch (Exception e) {
}
t.cancel();//取消定时器,定时器线程停止
}
}
class T1 extends TimerTask{
public T1() {
}
public void execute() {
System.out.println(11111111);
}
}
class T2 extends TimerTask{
public T2() {
}
public void execute() {
System.out.println(22222222);
}
}