(初学)Java中的定时器Timer

一、概述

       定时计划任务功能在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);//停止虚拟机
	}

}

测试:(点击确定后不再继续显示时间)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值