java自行实现单线程定时器
2015-11-22 21:55
471 查看
由于timer类实现的定时器是多线程的,这容易造成错误。所以实现了个单线程的定时器,虽然有点误差。
1、任务执行接口
package TimerManager;
public interface ICmd {
public void excute();
}
2、任务基类
package TimerManager;
public class TaskCmd implements ICmd{
protected long excuteTime;
protected int times;
public TaskCmd(int delay, int times){
this.excuteTime = delay * 1000 + System.currentTimeMillis();
this.times = times;
}
@Override
public void excute() {
}
}
3、时间管理类:package TimerManager;
import java.util.ArrayList;
public class TimerManager {
private static ArrayList<TaskCmd> taskList = new ArrayList<TaskCmd>();
private static ArrayList<TaskCmd> delList = new ArrayList<TaskCmd>();
public static void addTask(TaskCmd task){
taskList.add(task);
}
public static void loop(){
for(TaskCmd task : delList){
taskList.remove(task);
}
long nTime = System.currentTimeMillis();
for(TaskCmd task : taskList){
if(task.excuteTime <= nTime){
task.excute();
--task.times;
if(task.times <= 0)
delList.add(task);
}
}
}
}
1、任务执行接口
package TimerManager;
public interface ICmd {
public void excute();
}
2、任务基类
package TimerManager;
public class TaskCmd implements ICmd{
protected long excuteTime;
protected int times;
public TaskCmd(int delay, int times){
this.excuteTime = delay * 1000 + System.currentTimeMillis();
this.times = times;
}
@Override
public void excute() {
}
}
3、时间管理类:package TimerManager;
import java.util.ArrayList;
public class TimerManager {
private static ArrayList<TaskCmd> taskList = new ArrayList<TaskCmd>();
private static ArrayList<TaskCmd> delList = new ArrayList<TaskCmd>();
public static void addTask(TaskCmd task){
taskList.add(task);
}
public static void loop(){
for(TaskCmd task : delList){
taskList.remove(task);
}
long nTime = System.currentTimeMillis();
for(TaskCmd task : taskList){
if(task.excuteTime <= nTime){
task.excute();
--task.times;
if(task.times <= 0)
delList.add(task);
}
}
}
}
4、任务类
package test; import TimerManager.*; public class testTask extends TaskCmd{ <span style="white-space:pre"> </span>public testTask(int delay, int times) { <span style="white-space:pre"> </span>super(delay, times); <span style="white-space:pre"> </span> <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>@Override <span style="white-space:pre"> </span>public void excute() { <span style="white-space:pre"> </span>System.out.println("111"); <span style="white-space:pre"> </span>} }
5、mian函数循环
package test; import TimerManager.*; public class test { <span style="white-space:pre"> </span>public static void main(String[] args) { <span style="white-space:pre"> </span>TimerManager.addTask(new testTask(10,1)); <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>while(true){ <span style="white-space:pre"> </span>try { <span style="white-space:pre"> </span>Thread.sleep(100); <span style="white-space:pre"> </span>} catch (InterruptedException e) { <span style="white-space:pre"> </span>e.printStackTrace(); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>TimerManager.loop(); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} }
相关文章推荐
- java 虚拟机--新生代与老年代GC
- How to Write Doc Comments for the Javadoc Tool
- java 排序算法
- Spring定时任务的几种实现
- 对List里的对象元素进行排序
- eclipse快捷键大全啦啦啦啦
- java 汉字排序(思路一)
- SpringMVC项目 URL不进ACTION_
- java多线程--给点1,2,A,B四个线程,交叉输出数字和字母
- Log4j在Java中的使用
- JDK自带方法实现消息摘要运算
- Java类加载
- java hashcode和equal使用总结
- 整合spring和hibernate框架中事务的声明
- struts2拦截器的故事
- struts2拦截器的故事
- java内部类
- spring的依赖注入是什么意思
- JAVA 虚拟机字节码执行
- spring数据源配置