一个简陋的自定义用线程Thread实现的计时器Timer,可以增加定时时间
2017-03-03 17:06
381 查看
原来用的Timer(java.util.Timer),后来需要中途增加延迟时间,Timer不支持。自己写了个简陋的,应该够用。
类如下:
使用方法
创建,并定义一个任务,3秒后执行
增加5秒的延迟时间,相当于原来的任务是延迟8秒执行:
取消任务,不再执行:
类如下:
public class ExTimer extends Thread { private String TAG = "ExTimer"; private CallBack callBack; /** * 任务开始的时间 */ private long startTime; /** * 延迟多久执行 */ private long delay; /** * 判断这个线程是否还执行回调 */ private boolean stillRun = true; private ExTimer newTask; public ExTimer() { } @Override public void run() { try { startTime = System.currentTimeMillis(); Thread.sleep(delay); if (stillRun) { callBack.run(); } } catch (InterruptedException e) { e.printStackTrace(); } } /** * 模仿Timer的使用方法,因为之前用的是Timer * @param callBack * @param delay */ public void schedule(CallBack callBack, long delay) { this.callBack = callBack; this.delay = delay; start(); } /** * 增加延迟时间 * @param addDelay */ public void addDelay(long addDelay) { //计算这个计时器原来已经走了多久 long cha = System.currentTimeMillis() - startTime; //计算这个计时器原来剩下的时间 long lastDelay = this.delay - cha; if (lastDelay > 0) { //新的计时器延迟时间,剩下的+新增的 this.delay = lastDelay + addDelay; if (newTask != null) { newTask.interrupt(); } newTask = new ExTimer(); newTask.schedule(callBack, delay); startTime = System.currentTimeMillis(); stillRun = false; } } /** * 取消计时器 */ public void cancel() { if (newTask!=null){ newTask.interrupt(); newTask = null; } stillRun = false; interrupt(); } /** * 提供个接口回调 */ interface CallBack { void run(); } }
使用方法
创建,并定义一个任务,3秒后执行
ExTimer t = new ExTimer(); t.schedule(new ExTimer.CallBack() { @Override public void run() { Log.i(TAG, "run: dely"); } },3000);
增加5秒的延迟时间,相当于原来的任务是延迟8秒执行:
if (t!=null){ t.addDelay(5000); }
取消任务,不再执行:
if (t!=null){ t.cancel(); }
相关文章推荐
- 编写一个多线程函数实现对数组排序,要求: 1.至少用两个线程 2.数组的元素值可以事先定义好,或者可以从键盘输入(增加一个线程)。 3.用一个线程对数组排序,用另一个线程输出排序结果。 4.保证先排好序,再输出。
- 如果一个类通过继承Thread来实现多线程的话,则不适合多个线程共享资源,而通过实现Runnable就可以做到这一点
- Android在后台线程实现 定时更新时间
- timer 的使用 模拟显示时间,可以每隔一段时间定时执行调度
- java实现指定时间触发一个事件(比如定时发送短信)
- java开发线程篇1:java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?
- java中有几种方法可以实现一个线程?用什么关键字修饰同步
- 定时器与多线程 SetTimer and Multi-Thread 每个线程独立使用一个定时器
- Android开发笔记之:如何安全中止一个自定义线程Thread的方法
- 别用Timer+Windows 服务来实现一个定时任务
- 用JQuery.timer插件实现一个计时器
- handler实现自定义对话框(Dialog)的数据定时(TimerTask)更新
- 服务 {49A27252-A326-4EF1-B698-6EBC7068833C} 的计时器作业 id {573BE459-DF82-481C-84BD-CA14D287450B} 配置刷新的上一个实例仍在运行,因此将跳过当前的实例。请考虑增加作业之间的时间间隔。
- 除了用一个时间器来定时获得当前时间外。还有什么办法可以实时准确的获得当前时间?
- handler实现自定义对话框(Dialog)的数据定时(TimerTask)更新
- Java 有几程方法可以实现一个线程?用什么关键字修饰同步?stop()和suspend()为什么不推荐使用?
- 一道小测试题,一个线程既实现了Runnable接口又继承Thread方法
- handler实现自定义对话框(Dialog)的数据定时(TimerTask)更新
- java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?
- c语言使用链表编写一个可以实现班级学生管理系统,增加,删除,修改学生信息