导航:首页 > 编程语言 > java的timer类

java的timer类

发布时间:2022-06-28 07:24:56

1. java timer类自动执行

javax.swing.Timer

在指定时间间隔触发一个或多个 ActionEvent。一个示例用法是动画对象,它将 Timer 用作绘制其帧的触发器。

设置计时器的过程包括创建一个 Timer 对象,在该对象上注册一个或多个动作侦听器,以及使用 start 方法启动该计时器。例如,以下代码创建并启动一个每秒(该时间由 Timer 构造方法的第一个参数指定)触发一次动作事件的计时器。Timer 构造方法的第二个参数指定接收计时器动作事件的侦听器。

int delay = 1000; //milliseconds
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
//...Perform a task...
}
};
new Timer(delay, taskPerformer).start();构造 Timer 时要指定一个延迟参数和一个 ActionListener。延迟参数用于设置初始延迟和事件触发之间的延迟(以毫秒为单位)。启动了计时器后,它将在向已注册侦听器触发第一个 ActionEvent 之前等待初始延迟。第一个事件之后,每次超过事件间延迟时它都继续触发事件,直到被停止。

构造之后,可以单独更改初始延迟和事件间延迟,并且可以添加其他 ActionListener。

如果希望计时器只在第一次时触发然后停止,可以对计时器调用 setRepeats(false)。

尽管所有 Timer 都使用一个共享线程(由第一个执行操作的 Timer 对象创建)执行等待,但是 Timer 的动作事件处理程序还会在其他线程(事件指派线程上)执行。这意味着 Timer 的操作处理程序可以安全地在 Swing 组件上执行操作。但是,它也意味着处理程序必须快速执行以保证 GUI 作出响应。

在 1.3 版本中,向 Java 平台添加了另一个 Timer 类:java.util.Timer。该类和 javax.swing.Timer 的基本功能相同,但是 java.util.Timer 更常用,功能更多。javax.swing.Timer 有两个特征,它们可以让使用 GUI 更方便。首先,其事件处理程序都是 GUI 程序员所熟悉的,并且可以更简单地处理事件指派线程。第二,其自动线程共享意味着不必采取特殊步骤来避免生成过多线程。相反,计时器使用同一个线程让光标闪烁、使工具提示显示等等。

new Timer().schele(new TimerTask(){
public void run() {
System.exit(0);
}}, 5000);
5秒后自动运行run里的内容,如果setRepeats(ture),5秒一个周期的自动运行。

2. Java中Timer类的schele方法开始计时时间是不是创建timer对象的时刻

通过查看JDK源码可以知道如下:
public
void
schele(TimerTask
task,
long
delay)
{
if
(delay
<
0)
throw
new
IllegalArgumentException("Negative
delay.");
sched(task,
System.currentTimeMillis()+delay,
0);
}
实际上调用的是如下方法:
private
void
sched(TimerTask
task,
long
time,
long
period)
//task:安排的任务,the
scheled
task;
//time:指定的时间去执行
*
at
the
specified
time
with
the
specified
period,
in
milliseconds.
//period:如果period是正数,则会重复执行任务,如果是零则只执行任务一次
If
period
is
*
positive,
the
task
is
scheled
for
repeated
execution;
*
zero,
the
task
is
scheled
for
one-time
execution.
因此可以分析到
中间书写的语句不会算在延迟时间中,程序的开始时刻就是执行到timer.schele(new
Task(),1000);//语句时,开始计时。而Timer
timer
=
new
Timer()
只是创建了一个Timer类对象。
只有程序执行到timer.schele(new
Task(),1000)时,才会调用
sched(task,
System.currentTimeMillis()+delay,
0)方法,而这时该方法
才去执行System.currentTimeMillis取得当前时间,并将该任务加到TaskQueue队列中
(自带任务队列),经过System.currentTimeMillis+1000毫秒后根据指定状态执行指定任务.

3. java 通过查询Timer类的方法,解决以下问题:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
import java.util.Calendar;
import java.util.Date;
public class SwingTimerDemo{

static boolean bStop = false;

void init(){

int delay = 10000; //milliseconds, 10seconds
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
Calendar calendar1 = Calendar.getInstance();
calendar1.set(Calendar.DATE, calendar1.getActualMaximum(Calendar.DATE));
int month1 = calendar1.get(Calendar.DAY_OF_MONTH);

Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(new Date());
int month2 = calendar2.get(Calendar.DAY_OF_MONTH);
int hour2 = calendar2.get(Calendar.HOUR_OF_DAY);
if(month1==month2 && hour2==17){
doSomething();
}
}
};
new Timer(delay, taskPerformer).start();
}

void doSomething(){
System.out.println("Timer .............");
}

public static void main(String argv[])throws Exception{
new SwingTimerDemo().init();
System.out.println("Timer started .............");
while(!bStop){
Thread.sleep(1000);
}
}

}

请参考,完整代码。

4. 求问java中的Timer类是一个线程吗

在 Java 2 SDK, Standard Edition, Version 1.3 中引入这个框架之前,开发人员必须编写自己的调度程序,这需要花费很大精力来处理线程和复杂的 Object.wait() 方法。不过,Java 计时器框架没有足够的能力来满足许多应用程序的计划要求。甚至一项需要在每天同一时间重复执行的任务,也不能直接使用 Timer 来计划,因为在夏令时开始和结束时会出现时间跳跃。
本文展示了一个通用的 Timer 和 TimerTask 计划框架,从而允许更灵活的计划任务。这个框架非常简单 ? 它包括两个类和一个接口 ? 并且容易掌握。如果您习惯于使用 Java 定时器框架,那么您应该可以很快地掌握这个计划框架。
计划单次任务
想象一个煮蛋计时器,在数分钟之后(这时蛋煮好了)它会发出声音提醒您。清单 1 中的代码构成了一个简单的煮蛋计时器的基本结构,它用 Java 语言编写:
清单1. EggTimer 类 package org.tiling.scheling.examples;
import java.util.Timer;
import java.util.TimerTask;
public class EggTimer {
private final Timer timer = new Timer();
private final int minutes;
public EggTimer(int minutes) {
this.minutes = minutes;}public void start() {
timer.schele(new TimerTask() {
public void run() {
playSound();
timer.cancel();}private void playSound() {
System.out.println("Your egg is ready!");
// Start a new thread to play a sound...}
}, minutes * 60 * 1000);}public static void main(String[] args) {
eggTimer.start();}}EggTimer 实例拥有一个 Timer 实例,用于提供必要的计划。用 start() 方法启动煮蛋计时器后,它就计划了一个 TimerTask,在指定的分钟数之后执行。时间到了,Timer 就在后台调用 TimerTask 的 start() 方法,这会使它发出声音。在取消计时器后这个应用程序就会中止。

5. 在JAVA中的定时器Timer类,有句话如下,它是什么意思。

这里的容器是指运行你的应用程序的环境,比如你是一个servlet,一个websevice服务等托管与Tomcat、Jboss、WebLogic、Websphere这样的服务器中运行,那么Tomcat、Jboss、Weblogic、Websphere就叫做容器。
因为线程由部署在容器中的应用负责,所以如果应用程序线程控制不力,那么可能会导致内存泄露,或者导致容器崩掉。
也就类似于:
容器是宾馆,每个房间给每个人住,每个人就是部署在其中的服务。一个人房间点火,如果火候控制不利,整个宾馆可能被烧掉,因为宾馆这个容器无法控制人的点火行为。所以不推荐使用。

6. java 中timer类的用法是什么

现在项目中用到需要定时去检查文件是否更新的功能。timer正好用于此处。
用法很简单,new一个timer,然后写一个timertask的子类即可。
package comz.autoupdatefile;

import java.util.Timer;
import java.util.TimerTask;

public class M {
public static void main(String[] args) {
// TODO todo.generated by zoer
Timer timer = new Timer();
timer.schele(new MyTask(), 1000, 2000);
}
}

class MyTask extends TimerTask {

@Override
public void run() {
System.out.println("dddd");

}

}
这样,就可以在1秒钟之后开始执行mytask,每两秒钟执行一次。
当然,timer的功能也可以通过自己构造线程,然后在线程中用sleep来模拟停止一段时间,然后再执行某个动作。
其实,看一下timertask的源码就立即可以知道,timertask就是实现了runnable接口的。也就是说,通过timer来间隔一段时间执行一个操作,也是通过一个线程来做到的。

7. java的timer类如何判断程序超时呢

参照如下的:
Timer类是用来执行任务的类,它接受一个TimerTask做参数
TimerTask是个抽象类,他扩展了Object并实现了Runnable接口,因此你必须在自己的Task中实现publicvoid run()方法。这也就是我们需要执行的具体任务。

Timer有两种执行任务的模式,最常用的是schele,它可以以两种方式执行任务:1:在某个时间(Data),2:在某个固定的时间之后(intdelay).这两种方式都可以指定任务执行的频率

我们指定一个线程A,调用对象B.wait(timeout),线程A就会阻塞,直到timeout到了,B醒来会使A继续执行。
其实Timer类是为多任务定时设计的,在实现里面,B是一个任务队列(实现上就是一个array),维护着所有使用当前Timer定时的任务,它们可是一堆货真价实的线程实例。每次线程A都取队列中距离当前时间最近的的定时任务,跟当前时间比较,然后wait(timeout)这段时间。线程唤醒的时刻也是队列中这个定时任务运行的时刻。然后线程继续取下一个定时任务,继续wait(timeout)。从这里我们能看出来,每次定时都有额外的时间开销,比如要维护队列等,所以Java的Timer类不保证实时。
Timer中最主要由三个部分组成:
任务TimerTask 、 任务队列: TaskQueue queue 和 任务调试者:TimerThreadthread

Timer对任务的调度是基于绝对时间的。
所有的TimerTask只有一个线程TimerThread来执行,因此同一时刻只有一个TimerTask在执行。
任何一个TimerTask的执行异常都会导致Timer终止所有任务。
由于基于绝对时间并且是单线程执行,因此在多个任务调度时,长时间执行的任务被执行后有可能导致短时间任务快速在短时间内被执行多次或者干脆丢弃多个任务。
由于Timer/TimerTask有这些特点(缺陷),因此这就导致了需要一个更加完善的任务调度框架来解决这些问题。

默认情况下,只要一个程序的timer线程在运行,那么这个程序就会保持运行。当然,你可以通过以下四种方法终止一个timer线程:
调用timer的cancle方法。你可以从程序的任何地方调用此方法,甚至在一个timertask的run方法里。
让timer线程成为一个daemon线程(可以在创建timer时使用newTimer(true)达到这个目地),这样当程序只有daemon线程的时候,它就会自动终止运行。
当timer相关的所有task执行完毕以后,删除所有此timer对象的引用(置成null),这样timer线程也会终止。
调用System.exit方法,使整个程序(所有线程)终止。

8. 关于JAVA的定时类 Timer的问题

可以参考如下:
假定你的定时器是在每一月最后一天的0点执行
那么修改定时器,在每一天的0点执行

执行的过程不是直接调用真实的功能实现,而是先判断当天是否为当月的最后一天,这个不难吧,取得当前年,取得当前月,取得当前日,判断是否闰年等等

如果是当月最后一天,调用实际定时器功能实现,如果不是,退出,继续定时

9. java timer类需要执行么

javax.swing.Timer

在指定时间间隔触发一个或多个 ActionEvent。一个示例用法是动画对象,它将 Timer 用作绘制其帧的触发器。

设置计时器的过程包括创建一个 Timer 对象,在该对象上注册一个或多个动作侦听器,以及使用 start 方法启动该计时器。例如,以下代码创建并启动一个每秒(该时间由 Timer 构造方法的第一个参数指定)触发一次动作事件的计时器。Timer 构造方法的第二个参数指定接收计时器动作事件的侦听器。

int delay = 1000; //milliseconds
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
//...Perform a task...
}
};
new Timer(delay, taskPerformer).start();构造 Timer 时要指定一个延迟参数和一个 ActionListener。延迟参数用于设置初始延迟和事件触发之间的延迟(以毫秒为单位)。启动了计时器后,它将在向已注册侦听器触发第一个 ActionEvent 之前等待初始延迟。第一个事件之后,每次超过事件间延迟时它都继续触发事件,直到被停止。

构造之后,可以单独更改初始延迟和事件间延迟,并且可以添加其他 ActionListener。

如果希望计时器只在第一次时触发然后停止,可以对计时器调用 setRepeats(false)。

尽管所有 Timer 都使用一个共享线程(由第一个执行操作的 Timer 对象创建)执行等待,但是 Timer 的动作事件处理程序还会在其他线程(事件指派线程上)执行。这意味着 Timer 的操作处理程序可以安全地在 Swing 组件上执行操作。但是,它也意味着处理程序必须快速执行以保证 GUI 作出响应。

在 1.3 版本中,向 Java 平台添加了另一个 Timer 类:java.util.Timer。该类和 javax.swing.Timer 的基本功能相同,但是 java.util.Timer 更常用,功能更多。javax.swing.Timer 有两个特征,它们可以让使用 GUI 更方便。首先,其事件处理程序都是 GUI 程序员所熟悉的,并且可以更简单地处理事件指派线程。第二,其自动线程共享意味着不必采取特殊步骤来避免生成过多线程。相反,计时器使用同一个线程让光标闪烁、使工具提示显示等等。

new Timer().schele(new TimerTask(){
public void run() {
System.exit(0);
}}, 5000);
5秒后自动运行run里的内容,如果setRepeats(ture),5秒一个周期的自动运行。

10. java中有timer类吗

有的
Timer timer = new Timer();
timer.schele(new MyTask(), 1000, 2000);

阅读全文

与java的timer类相关的资料

热点内容
成都市区建成面积算法 浏览:656
智能家居单片机 浏览:93
买男装用什么app好 浏览:851
文件夹合并了怎么拆开 浏览:256
波段副图源码无未来函数 浏览:84
livecn服务器地址 浏览:257
程序员这个工作真的很吃香吗 浏览:844
程序员和数学分析师待遇 浏览:678
压缩气弹簧怎么拆 浏览:321
华为公有云服务器添加虚拟ip 浏览:209
程序员和运营哪个累 浏览:24
抖音安卓信息提示音怎么设置 浏览:454
光速虚拟机的共享文件夹 浏览:248
程序员培训机构发的朋友圈真实性 浏览:742
天干地支简单算法 浏览:299
下载个压缩文件 浏览:300
普通人电脑关机vs程序员关机 浏览:628
米酷建站源码 浏览:115
氢气app怎么搜搭配 浏览:619
pdf绿盟 浏览:505