Runnable接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个名为run()的无参数方法。void run().

此外,Runnable为非Thread子类提供了一种激活方式。通过实例化某个Thread实例并将自身作为运行目标,就可以运行实现Runnable的类而无须创建Thread的子类。


4、定时器TimerTask

    TimerTask是一种特殊的线程,用来为Timer安排一次执行或者重复执行的任务。他实现了Runable接口,是一个抽象类

public abstract class TimerTask extends Object implements Runnable

她本身没有实现run函数,因此需要子类来实现它。

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

public class TestTimerTask extends TimerTask{
	public void run(){
		System.out.println(new Date());
	}
        //每隔1秒,打印时间
	public static void main(String[] args){
		Timer timer = new Timer();
		TestTimerTask task = new TestTimerTask();
		timer.schedule(task,1000,1000);
		
	}
}

    定时器任务与线程不同,它是定时执行的线程,因此不能够直接使用start()来启动它,而需要使用一个特殊的类Timer来启动它。Timer是一个工具,用来安排在后台线程中执行的任务。可以安排任务执行一次,或者定期重复执行。

    对Timer对象最后的引用完成后,并且所有未处理的任务都已经执行完毕后,计时器的任务执行线程会正常终止,并且成为垃圾回收的对象,但是这可能需要花费很长时间。所以想要快速终止计时器的任务执行线程,那么调用计时器的cancle方法即可。void cancle();

    Timer运行定时器的方式有如下几种:

  • 安排在指定的时间执行指定的任务 void schedule(TimerTask task,Date time)

  • 安排指定的任务在指定的时间开始进行重复的固定延迟执行    void schedule(TimerTask task,Date firstTime,long period);

  • 安排在指定延迟后执行指定的任务    void schedule(TimerTask task,long delay);


5、使用线程组。

    线程是可以被组织的,Java中每个线程都是线程组的成员,线程组把多个线程集成为一个对象,通过线程组可以同时对其中的多个线程进行操作,如启动一个线程组的所有线程等。Java的线程组通过ThreadGroup类实现。

    ThreadGroup类用来管理一组线程,包括线程的数目、线程之间的关系、线程正在执行的操作,以及线程将要启动或终止时间等。线程组还可以包含线程组。

    使用线程组的好处是,可以对一组线程进行整体操作,可用的操作函数包括

  • resume();//恢复执行该线程组的所有处理

  • stop();//停止该线程组中的所有处理

  • suspend();//挂起该线程组的所有处理

  • destroy();//撤销该线程组和它的所有子线程