定时器

原创
2013/09/03 21:03
阅读数 99

线程
     
线程是可以在一个程序里面平行运行的执行路线,线程与线程之间可以共享变量。java线程的启动很快,而且程序员可以比控制过程更容易的控制线程。使用线程可以使程序快速地处理同时来自不同计算机的请求,因此在分散系统设计里经常使用线程。
线程的生命周期
      
首先当一个线程被创建时,线程处于“new Thread”状态,这时线程还没有运行。然后客户端需要调用start()方法,使线程开始运行。调用这个方法会为此线程产生一个新的运行环境,并调用run()方法,线程开始运行后便进入Runnable状态,其次,通过调用sleep() 、wait()或者由于I/O阻塞,可以使线程进入Not Runnable状态。最后,如果线程处于Runnable或者 Not Runnable状态的话,调用isAlive()方法会得到true。如果run()方法结束,线程可以自己停下来,线程也可以由外界停下来。用UML状态图描述线程的生命周期,如下图所示:
                    

在一个多线程的程序里,为避免线程无谓地等待(starvation),甚至线程之间的死锁(deadlock),多线程的编程特别要注意线程的同步化(synchronization)。



定时器

     
线程的编程比较不容易掌握,除非特别需要,应当尽量使用高级线程API。比如java.util.Timer类是java1.3版本引进的定时器类,此类封装了定时器所需的线程功能。与此类相应的,还有一个TimerTask类,封装了当定时任务需要反复发生时所需的线程功能。如果仅仅是为了定时执行一个操作,应当使用Timer类。用UMl类图描述Timer和TimerTask类的设计,如下图所示:

                           

     从上面的类图可以看出,Timer是TimerThread的子类,TimerThead是Thread的实现,因此Timer是Thread的实现。同时,TimerTask 是Runnable的实现,从而也使一个线程。Timer和TimerTask都是线程,而且是彼此独立的线程。

     Timer类给出一系列的scheduler方法,用于定时执行一个TimerTask类型的对象。TimerTask的对象则含有具体的run()方法,这个方法可以调用系统所要执行的内部或者外部任务。
     实例代码如下:

package com.model.TimerDemo;

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

/**
 * 使用Timer 定时器
 * */
public class Reminder {

	private Timer timer;
	
	//构造函数,在seconds秒后执行一个任务
	public Reminder(int seconds){
		timer = new Timer();
		timer.schedule(new RemindTask(), seconds*1000);
	}
	
	// 内部成员类,描述将要执行的任务
	class RemindTask extends TimerTask{

		public void run() {
			System.out.println("time's up!");
			timer.cancel();
		}
	}
	
	//静态方法
	public static void main(String[] args) {
		System.out.println("About to schedule task");
		new Reminder(10);
		System.out.println("Task scheduled");
	}
}
     在每一个Timer对象的背后,都有一个背景线程,用来顺序执行Timer的任务。这些任务应当迅速结束,不然就会霸占timer 用来执行任务的线程,从而延迟后面的任务。

     当所有的任务完成以后,timer的任务执行线程就会顺利地结束并被java的GC收集,只是由于java的垃圾回收机制,回收的时间不能预测。如果程序想要迅速的结束timer的任务执行线程,程序员可以调用timer的cancel()方法。

     Timer类是线程安全的,这意味着可以有多个线程共享同一个Timer对象,而不需要同步化。







展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部