当前位置: 首页 > article >正文

java定时器Timer 类的使用及Timer already cancelled问题解决

1. Timer和TimerTask

  Timer是jdk中提供的一个定时器工具,使用的时候会在主线程之外另起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次。

  TimerTask是一个实现了Runnable接口的抽象类,代表一个可以被Timer执行的任务。


2. 一个简单的Timer使用示例

package com.dswh.test;
import java.util.Timer;
import java.util.TimerTask;
public class TimerTest {public static void main(String[] args) {Timer timer = new Timer();timer.schedule(task, 0, 3000);}static TimerTask task = new TimerTask() {@Overridepublic void run() {System.out.println("每3s执行一次");}};}

执行效果:定时每3秒执行一次任务

取消定时任务只需再调用一次timer.cancel();即可取消任务调度。

package com.dswh.test;
import java.util.Timer;
import java.util.TimerTask;
public class TimerTest {public static void main(String[] args) throws Exception {Timer timer = new Timer();timer.schedule(task, 0, 2000);Thread.sleep(10000);//取消定时任务timer.cancel();System.out.println("定时任務已取消");}static TimerTask task = new TimerTask() {@Overridepublic void run() {System.out.println("每3s执行一次");}};}

3.关于Timer already cancelled以及Task already scheduled or cancelled问题

3.1问题的原因

当我们使用task.cancel()或者timer..cancel()来取消定时任务后再调用原来的定时任务时,可能会出现这两种错误,原因是因为每个task都是一次性的消耗品,当使用cancel方法后,这个task就被消耗掉了,想要再次使用就只能再次创建新的task,timer也是如此。如下:

3.2 多任务调度

方式一: 

如果有多个定时task要执行,我们可以提供继承TimerTask来分别定义两个task的方法实现。当想要取消某个task,使用task.cancel()来取消指定task,可以将timer设置为全局变量,所有task共用一个timer。

task1:

package com.dswh.test;import java.util.TimerTask;public class Task1 extends TimerTask{@Overridepublic void run() {System.out.println("我是task1,每2s执行一次");}}

task2: 

package com.dswh.test;import java.util.TimerTask;public class Task2 extends TimerTask {@Overridepublic void run() {System.out.println("我是task2,每3s执行一次");}}

测试:

package com.dswh.test;
import java.util.Timer;
import java.util.TimerTask;
public class TimerTest {private static Timer timer = new Timer();public static void main(String[] args) throws Exception {//新建task1Task1 task1 = new Task1();//新建task2Task2 task2 = new Task2();//调度timer.schedule(task1, 0, 2000);timer.schedule(task2, 0, 3000);Thread.sleep(5000);//取消定时任务task1.cancel();System.out.println("task1 cancel");//此时就不能再调用task1了,否则会报Task already scheduled or cancelled//想再次调用只能重新new Task1();//新建task1Task1 task1_1 = new Task1();//再次调度timer.schedule(task1_1, 0, 2000);}}

 

方式二:执行某些定时任务,我们可能需要传递些参数,这时我们可以使用下面这种方式

task1:

package com.dswh.test;import java.util.TimerTask;public class Task1{public TimerTask  getTask1(String s) {return new TimerTask() {@Overridepublic void run() {System.out.println(s);}};}
}

测试:

package com.dswh.test;
import java.util.Timer;
import java.util.TimerTask;
public class TimerTest {private static TimerTask task = null;private static Timer timer = new Timer();public static void main(String[] args) throws Exception {//开始任务startTask("我是传入的参数,执行task1任务");Thread.sleep(3000);//取消任务endTask("任务结束了");//再次开启Thread.sleep(3000);startTask("任务再次开启");}public static void startTask(String s) throws InterruptedException {if (task==null) {task = new Task1().getTask1(s);}timer.schedule(task, 0, 1000);}public static void endTask(String s) {task.cancel();task=null;System.out.println(s);}}

 

 

http://www.lryc.cn/news/2418437.html

相关文章:

  • Apache License Version 2.0中文翻译版
  • 关于Tapestry5运行时报错的解决方法。
  • TransactionScope使用(二)——msdtc不可用
  • hmailserver的反垃圾邮件功能
  • 基于python豆瓣电影爬虫数据可视化分析推荐系统(完整系统源码+数据库+详细文档+论文+详细部署教程)
  • 《黄金瞳》 台词:你人真好!
  • FreeBSD下Mount总结
  • ISA Server 2004的安装与SMTP 筛选器的使用
  • ExtJS中表格控件的使用,属性设置和数据的获取
  • 深入浅出—设计模式重要原则
  • 网页客服代码集锦
  • TC20下的内联汇编 (转)
  • 让你的Vista,Win7变成多国语言版!
  • 信托公司利用境外资金的两大途径
  • Linux中的Netlink详解
  • Dialog.dismiss()方法无效的解决方法
  • 如何利用python盗qq_一个团队为了让我帮他提高流量,竟然盗我QQ,没办法,我只好帮他用python刷了刷流量!...
  • 电脑浏览器打不开但是可以上网微信和qq可以正常登录的解决办法
  • 中央处理器 —— CPU的功能和基本结构
  • PGXZ-腾讯全功能分布式关系数据集群
  • 一次macOS的升级填坑(macOS Catalina - macOS Monterey)
  • 笛卡尔积是什么?多表查询中的消除笛卡尔积。
  • Drupal10使用composer安装module和theme
  • UEFI与 Legacy BIOS两种启动模式详解
  • 常用CHM帮助文档集锦下载
  • html 全场开场动画,HTML5 星际大战电影开场字幕动画
  • 适用于 Java 程序员的 CSP ,第 2 部分
  • LCD常见接口总结
  • jquery获取input的值
  • python读取excel汉字转成拼音_怎样把excel中的汉字转换成拼音