一、概述
定时计划任务功能在Java中主要使用的就是Timer对象,它在内部使用多线程的方式进行处理,所以它和多线程技术还是有非常大的关联的。在JDK中Timer类主要负责计划任务的功能,也就是在指定的时间开始执行某一个任务,但封装任务的类确实TimerTask类。
二、应用场景
我们使用timer的时候,一般有4种情况,但常用的有2种场景:
1、指定时间执行;
2、指定时间执行后间隔指定时间重复执行;
三、使用方法
1、首先要通过继承TimerTask类并实现run()方法来自定义要执行的任务(当然也可以写成匿名内部类)
2、需要创建一个定时器(Timer类对象),并通过Timer,schedule(TimerTask task,Date time)方法执行时间运送任务。
代码一:使用外部类
package day08;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
/*
* Timer 定时器
*/
public class TimerDemo01 {
public static void main(String[] args) {
//创建Timer对象
Timer t=new Timer();
//第一个参数,要传入一个定时器任务对象
//第二个参数要传入时间
//创建任务对象
MyTask task=new MyTask();
//t.schedule(task, 5000);
//每个多少个毫秒来重复执行这个任务
t.schedule(task,5000,1000);//第一个是传入定时器的任务,第二个是传入时间,第三个参数是每隔多少个毫秒进行下一次
}
}
//定义定时器的任务
class MyTask extends TimerTask{
@Override
public void run() {//编写执行任务代码
//创建系统
Date date=new Date();
//创建格式化时间对象
SimpleDateFormat sd=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//格式化Date时间类型,返回格式化之后的字符串
String time=sd.format(date);
//将时间输出到控制台
System.out.println(time);
}
}
测试:(5000毫秒也就是5秒后显示第一个输出,往后是一秒输出一次)
代码二:使用匿名内部类实现倒计时
package day08;
import java.util.Timer;
import java.util.TimerTask;
public class TimerDemo02 {
public static void main(String[] args) {
Timer t=new Timer();
t.schedule(new TimerTask(){
int count=10;
public void run() {
// TODO Auto-generated method stub
System.out.println("倒计时:"+count);
count--;
if(count==0) {
System.out.println("砰");
//取消定时器
t.cancel();
}
}
},500,1000);
}
}
测试:
代码三:同样是内部类,个人觉得这种只适合一个线程。
package day08;
import java.util.Timer;
import java.util.TimerTask;
/**
* Timer 定时器
* @author Administrator
*
*/
public class TimerDemo04 {
public static void main(String[] args) {
//倒计时,实现从10开始倒计时,当计数器到0时,模拟发出爆炸声
Timer t=new Timer();
TimerTask task=new TimerTask(){
int count=10;
public void run() {
// TODO Auto-generated method stub
System.out.println(count);
count--;
if(count==0) {
System.out.println("peng");
t.cancel();
}
}
};
t.schedule(task, 0, 1000);
}
}
测试:
四、Swing包下的Timer使用
计时器(Timer)组件可以在指定时间间隔出发一个或多个ActionEvent。设置计时器的过程包括创建一个Timer对象,在该对象上注册一个或多个动作监听器,以及使用start()方法启动该计时器。
例如,以下代码创建并启动一个每秒(该时间由Timer构造方法的第一个参数指定)触发一次动作事件的计时器。Timer构造方法的第二个参数指定接收计时器动作事件的监听器。
创建Timer类时要指定一个延迟参数和一个ActionListener。延迟参数用于设置初始延迟和事件触发之间的延迟(以毫秒为单位)。启动计时器后,它将在向已注册监听器触发第一个ActionEvent之前等待初始延迟。第一个事件之后,每次超过事件间延迟时它都继续触发事件,直到被停止。
创建Timer类之后,可以单独更改初始延迟和事件间延迟,并且可以添加其他ActionListener。如果希望计时器只在第一次时触发然后停止,可以对计时器调用setRepeats(false)。
4.1、常用API
addActionListener(ActionListener 1):将一个动作监听器添加到Timer
getDelay():返回两次触发动作事件间延迟,以毫秒为单位。
isCoalesce():如果Timer组合多个挂起的动作事件,则返回true。
isRunning():如果Timer正在运行,则返回true。
restart():重新启动Timer,取消所有挂起的出发并使它按初始延迟触发。
setCoalesce(boolean flag):设置Timer是否组合多个挂起的ActionEvent。
setDelay(int delay):设置Timer的事件间延迟,两次连续的动作事件之间的毫秒数。
setLogTimers(boolean flag):启动/禁用计时器日记。
setReapeats(boolean flag):如果flag为false,则指示Timer只向其监听器发送一次事件。
start():启动Timer,使它开始向其监听器发送动作事件。
stop():停止Timer,使它停止向其监听器发送动作事件。
代码:
package day08;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import javax.swing.JOptionPane;
import javax.swing.Timer;
/*
* Swing Timer在swing包下面的一个类(组件)
*/
public class ThreadTimerDemo01 {
public static void main(String[] args) {
Timer timer=new Timer(1000,new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(new Date());//定时打印当前时间
// Toolkit.getDefaultToolkit().beep();//响一声
}
});
//启动定时器
timer.start();
JOptionPane.showMessageDialog(null, "确定退出程序?");//开启后弹框询问是否停止
System.exit(0);//停止虚拟机
}
}
测试:(点击确定后不再继续显示时间)