`
沙漠绿树
  • 浏览: 430264 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JAVA定时器

阅读更多
引用
    一直在做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”格式。它们源码如下,敬请大家指教。


//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);
	}
}
4
2
分享到:
评论

相关推荐

    Java定时器

    Java定时器是Java编程语言中用于执行特定任务的调度工具,它允许程序员在指定的时间间隔后执行特定的代码块或任务。在Java中,我们主要使用`java.util.Timer`类和`java.util.TimerTask`类来实现定时器功能。这两个类...

    Java定时器的使用 Java程序

    Java定时器(java.util.Timer)是Java标准库中用于调度任务执行的重要工具,它允许我们按照预设的时间间隔执行特定的任务。在Java程序设计中,定时器常常用于实现周期性的任务,比如定时备份数据、定时检查系统状态...

    JAVA定时器JAVA定时器

    JAVA定时器,只要服务开启,就能指定某些代码在某个时刻执行,例如:监狱里罪犯的余刑天数,每天都要减少,就可以设置一个定时器在每天的23:59:59来执行减少余刑天数的天。

    java定时器

    java定时器,import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask; 规定每天几点执行一次

    Java定时器框架(Quartz)

    Java定时器框架Quartz是Java开发中用于任务调度的一个强大工具,它允许开发者精确地控制任务的执行时间,包括一次性任务和周期性任务。Quartz以其灵活性和稳定性,在企业级应用中广泛使用,尤其在需要定期执行后台...

    JAVA定时器JAVA定时器.pdf

    JAVA定时器 JAVA定时器是一种基于Quartz框架的任务调度器,用于在指定的时间执行特定的任务。在 Spring 框架中,JAVA定时器可以与Quartz框架集成,实现自动执行任务的功能。 1. JAVA定时器的基本概念 JAVA定时器...

    java 定时器(Timer)

    Java定时器(Timer)是Java Swing库中的一个类,它提供了调度任务在未来某个时间执行的能力。这个类主要用于在GUI应用程序中实现定时触发某些操作,比如更新界面、执行动画或者执行周期性的后台任务。Timer类结合了...

    Java定时器简例

    ### Java定时器实现详解 在Java编程中,定时任务是常见的需求之一,无论是服务器的定期维护、数据同步,还是客户端的动画更新等场景,都需要用到定时器来精确控制任务的执行时间。本文将深入解析一个基于Java的简单...

    java定时器设置及停止的方法

    在Java编程中,定时任务是不可或缺的一部分,它们用于执行周期性操作,如数据备份、监控、清理等。本文将深入探讨如何在Java中设置和停止定时任务,主要关注`java.util.Timer`和`java.util.TimerTask`,以及更现代的...

    java定时器的使用

    在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等。 对于这样的操作最方便、高效的实现方式就是使用java.util.Timer工具类。

    java 定时器 spring 定时器

    Java定时器和Spring定时器是Java开发中用于执行周期性任务的重要工具,它们在系统维护、数据同步、报告生成等场景中发挥着关键作用。本文将深入探讨这两个概念,以及如何在Spring框架中配置和使用定时器。 首先,...

    java定时器.rar

    Java定时器(Timer)是Java语言中用于调度任务的一个重要工具,它可以帮助我们在特定时间执行一次或重复执行某个任务。这个“java定时器.rar”压缩包可能包含了关于如何使用Java定时器的相关示例代码和教程。 Java...

    java定时器服务!!

    Java定时器服务是Java平台中用于执行定时任务的关键组件,它允许开发者安排未来或定期的任务执行。在Java中,我们通常使用`java.util.Timer`类和`java.util.TimerTask`类来实现定时服务。这两个类提供了创建、调度和...

    简单易用的java定时器scheduler,有完整配置说明

    Java定时器,通常被称为Scheduler,是Java开发中用于执行定期任务的重要工具。它允许开发者在特定的时间间隔或者按照预设的计划执行代码,这在处理数据同步、日志清理、发送通知等场景中非常常见。在Java中,我们...

    JAVA定时器时间抓取

    Java定时器和时间处理是Java开发中的重要组成部分,特别是在需要执行周期性任务或者对时间有精确控制的应用场景中。本文将深入探讨Java定时器(Timer)的使用以及如何获取和处理年月日、时间节点等时间相关的信息。 ...

    java定时器(timer类使用详解)

    Java定时器,也被称为`Timer`类,是Java标准库中的一个强大工具,它允许开发者在指定的时间间隔执行任务,从而实现定时操作。这个类在`java.util`包中定义,是实现定时任务调度的核心。在本文中,我们将深入探讨`...

    Java定时器数字时钟

    Java定时器数字时钟是一种基于Java编程语言实现的软件,它可以模拟系统时间并实时更新显示。这个程序是在Eclipse 7.5集成开发环境中编写的,Eclipse是Java开发者广泛使用的IDE,它提供了丰富的功能,如代码编辑、...

    Java定时器Timer简述共8页.pdf.zip

    Java定时器(Timer)是Java语言提供的一种用于执行定时任务的工具类,它位于java.util包下。在Java编程中,我们有时需要在特定的时间间隔内执行某些操作,例如每隔一段时间更新数据、发送通知或者执行定期维护等。这...

Global site tag (gtag.js) - Google Analytics