【java多线程与并发库】--- 定时器的应用
2012-05-09 16:54
405 查看
定时器的应用 1、 定时器主要涉及到两个类(java.util包中)
@-》public class Timer extends Object(一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。 )
@-->public abstract class TimerTask extends Object implements Runnable
(由 Timer 安排为一次执行或重复执行的任务。)
2、Timer类的构造方法:
构造方法摘要 | |
Timer() 创建一个新计时器。 | |
Timer(boolean isDaemon) 创建一个新计时器,可以指定其相关的线程作为守护程序运行。 | |
Timer(String name) 创建一个新计时器,其相关的线程具有指定的名称。 | |
Timer(String name, boolean isDaemon) 创建一个新计时器,其相关的线程具有指定的名称,并且可以指定作为守护程序运行。 | |
与每个 Timer 对象相对应的是单个后台线程,用于顺序地执行所有计时器任务。 计时器任务应该迅速完成。如果完成某个计时器任务的时间太长,那么它会“独占”计时器的任务执行线程。因此,这就可能延迟后续任务的执行,而这些任务就可能“堆在一起”,并且在上述不友好的任务最终完成时才能够被快速连续地执行。 对 Timer 对象最后的引用完成后,并且 所有未处理的任务都已执行完成后,计时器的任务执行线程会正常终止(并且成为垃圾回收的对象)。但是这可能要很长时间后才发生。 默认情况下,任务执行线程并不作为守护线程 来运行,所以它能够阻止应用程序终止。如果调用者想要快速终止计时器的任务执行线程,那么调用者应该调用计时器的cancel 方法。 如果意外终止了计时器的任务执行线程,例如调用了它的 stop 方法,那么所有以后对该计时器安排任务的尝试都将导致IllegalStateException,就好像调用了计时器的 cancel 方法一样。 此类是线程安全的:多个线程可以共享单个Timer 对象而无需进行外部同步。 此类不 提供实时保证:它使用 Object.wait(long) 方法来安排任务。 实现注意事项:此类可扩展到大量同时安排的任务(存在数千个都没有问题)。在内部,它使用二进制堆来表示其任务队列,所以安排任务的开销是 O(log n),其中 n 是同时安排的任务数。实现注意事项:所有构造方法都启动计时器线程。
方法摘要 | |
void | cancel() 终止此计时器,丢弃所有当前已安排的任务。 |
int | purge() 从此计时器的任务队列中移除所有已取消的任务。 |
void | schedule(TimerTask task,Date time) 安排在指定的时间执行指定的任务。 |
void | schedule(TimerTask task,Date firstTime, long period) 安排指定的任务在指定的时间开始进行重复的固定延迟执行。 |
void | schedule(TimerTask task, long delay) 安排在指定延迟后执行指定的任务。 |
void | schedule(TimerTask task, long delay, long period) 安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。 |
void | scheduleAtFixedRate(TimerTask task,Date firstTime, long period) 安排指定的任务在指定的时间开始进行重复的固定速率执行。 |
void | scheduleAtFixedRate(TimerTask task, long delay, long period) 安排指定的任务在指定的延迟后开始进行重复的固定速率执行。 |
3、TimerTask类的构造方法:
构造方法摘要 | |
protected | TimerTask() 创建一个新的计时器任务。 |
方法摘要 | |
boolean | cancel() 取消此计时器任务。 |
abstract void | run() 此计时器任务要执行的操作。 |
long | scheduledExecutionTime() 返回此任务最近实际 执行的已安排 执行时间。 |
实例1:
import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class TimerTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //每隔10s打印"hello,honey!"; new Timer().schedule(new TimerTask(){ @Override public void run() { // TODO Auto-generated method stub System.out.println("hello,honey!"); } }, 10000); while(true){ System.out.println(new Date().getSeconds());//打印当前秒数 try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }实例2:
import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class TimerTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //每隔10s打印"hello,honey!"; new Timer().schedule(new TimerTask(){ @Override public void run() { // TODO Auto-generated method stub System.out.println("hello,honey!"); } }, 10000,3000);//10s后打印,以后每隔3s打印一次 /*while(true){ System.out.println(new Date().getSeconds());//打印当前秒数 try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }*/ } }运行结果:
相关文章推荐
- 【java多线程与并发库】--- 定时器的应用
- Java多线程与并发库高级应用-传统定时器技术回顾
- Java多线程与并发库高级应用05
- 多线程并发库高级应用 之 传统定时器、互斥、同步通信技术
- 【Java多线程与并发库】2.传统定时器技术回顾
- 黑马程序员_java多线程与并发库高级应用
- Java多线程与并发库高级应用之线程数据交换Exchanger
- Java多线程与并发应用-(5)-如何优雅的使用ThreadLocal类
- 张孝祥_Java多线程与并发库高级应用01
- Java多线程与并发库高级应用-java5线程并发库
- Java多线程与并发应用-(10)-java阻塞队列实现ArrayBlockingQueue
- 【Java多线程与并发库】11.java5条件阻塞Condition的应用
- 多线程并发库高级应用 之 传统定时器、互斥、同步通信技术
- Java基础加强_Java多线程与并发库高级应用
- Java多线程与并发库高级应用之信号量Semaphore
- 张孝祥_Java多线程与并发库高级应用02
- 多线程并发库高级应用 之 使用java5中同步技术的3个面试题
- 【Java多线程与并发库】6.ThreadLocal类及应用技巧
- Java多线程与并发应用-(3)-传统线程通信技术及生产者消费者模式
- java多线程并发库高级应用 之 java5中的线程并发库--线程池、Callable&Future