定时器,听起来好像很高级的东西,但看一下API,你就会发现定时器(ScheduleExecutorService)其实就是一个Executors多线程框架而已,在Java的第3回中有过一些介绍,我们看一下ScheduleExecutorService的类关系图:
介绍一下ScheduledExecutorService的方法
schedule(task,delay,unit):安排所提交的Callable或Runnable任务在initDelay指定的时间后执行(unit是delay时间单位)
scheduleAtFixedRate():安排所提交的Runnable任务按指定的间隔重复执行
scheduleWithFixedDelay():安排所提交的Runnable任务在每次执行完后,等待delay所指定的时间后重复执行。
一般的执行过程都是:
接下来,看一个具体的例子吧
public class Test
{
public static void main(String args[]) throws InterruptedException, ExecutionException
{
// 初始化一个ScheduledExecutorService对象,这个对象的线程池大小为2
ScheduledExecutorService service = Executors
.newScheduledThreadPool(2);
//定义一个Runnable内部类
Runnable runner = new Runnable()
{
@Override
public void run()
{
System.out.println("Runner run");
}
};
// 调用ScheduledExecutorService对象来执行第二个任务,第二个任务所作的就是在9秒钟后取消第一个任务。
final ScheduledFuture future1 = service.scheduleAtFixedRate(runner, 0, 3,
TimeUnit.SECONDS);
ScheduledFuture<String> future2 = service.schedule(
new Callable<String>()
{
@Override
public String call() throws Exception
{
future1.cancel(true);
return "Caller call";
}
}, 9, TimeUnit.SECONDS);
System.out.println(future2.get());
}
}
运行结果:
Runner run
Runner run
Runner run
Runner run
Caller call
当然,能执行相同功能的还有Timer,但自从JDK 1.5之后有了ScheduledExecutorService,使用java.util.Timer显得很没有必要,因为它无论在性能还是在功能上都不如Scheduledexecutorservice