首先,了解什么是(Timer):Timer,定时器,功能是在指定的时间间隔内反复触发指定窗口的定时器事件。
现在用一个案例来具体了解下定时器的使用。
需求:模拟骑车时间,比如,每骑行一秒就输出一句“骑行第几秒”,直到用户输如随意指令就停止输出。
执行效果如图所示:
效果分析:首先需要控制台输入一个任意指令,让程序开始跑起来,接着开始每隔一秒钟输出一句话提醒用户。直到用户再次随意输入一个指令,输出停止。
在开始写代码之前,我们要明确,这肯定不是一个线程就能解决的事情,因为一个线程就只有一条线再跑,而用户输入就需要一个Scanner语句,但凡是Scanner语句,一定会在跑的这个线阻塞在Scanner的输入语句上面,那么这时候,就可以引用定时器这个东西。
以上的执行效果代码如下:
System.out.print("你輸入啥都可以開始使用"); if (in.next() != null) { Timer timer=new Timer(); timer.schedule(new TimerTask() { int i=0; @Override public void run() { i=i+1; System.out.println("骑行第"+(i)+"秒"); times=i; } },0,1000); if(in.next()!=null){ timer.cancel(); System.out.println("骑行结束!"); } }
代码分析:
首先让用户随意输入一个指令,判断当这个输入的指令不为空时,就走进计时器中,此时走入if语句当中。
接着实例化一个定时器,也就是Timer timer=new Timer;
调用Timer的schedule(TimerTask task(){},延迟时间,定时时间)方法。这时候调用这个方法需要传三个参数给这个方法,一个是TimerTask的一个抽象类,延迟时间,定时的时间,时间都用毫秒计算。强调一点,TimerTask是一个抽象类,就要继承这个抽象类中的所有方法,发现这个抽象类中有一个run()方法,这个时候,就需要将我们需要的输出“骑行第多少秒”这句话写在run方法中,让这个定时器每次走的时候,都输出,没有给他停止的命令,他就会一直走。
这个时候,主线程中,有一个一直等待用户输入的语句,这个和计时器的运行不冲突,直到用户输入了任意指令,进入一个if里面,接着执行timer的cancel()方法,将这个计时器停止掉,此时,计时器的功能就停止了,继续开始执行主线程。