java自行实现单线程定时器

本文介绍了一种基于Java的单线程定时器实现方法,通过定义任务接口、任务基类及时间管理类等,避免了多线程定时器可能带来的问题,并提供了一个简单的测试例子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于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);
			}
		}
	}
	

}
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>}


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值