Java 多线程 —— 定时器,svnlinux 使用教程
这里需要注意的是,Timer 和 TimerTask 都是线程,Timer 是一个计时器,每个 Timer 对象都是单个后台线程,会依次执行每个任务。
Timer() 创建一个新的计时器:
void schedule(TimerTask task, long delay) 在指定的延迟之后安排指定的任务执行。
void schedule(TimerTask task, long delay, long period)
在指定的延迟之后开始 ,重新执行固定延迟的指定任务(这里的具体任务指括号里面的参数, TimerTask 任务,第一个指定延迟的时间长度是 delay,之后的固定延迟时间是 period)
void cancel() 终止此计时器,丢弃任何当前计划的任务。
void schedule(TimerTask task, long delay)
package test.MyThread.TimeThread;
import java.util.Timer;
import java.util.TimerTask;
public class TimeDemo1 {
public static void main(String[] args) {
//创建一个新的定时器对象
Timer timer = new Timer();
//void schedule(TimerTask task, long delay)
// 在指定的 delay 延迟时间后,执行 task 任务
timer.schedule(new MyTask(timer),3000); //这里的 3000 是 3000 毫秒,即 3 秒
//timer.cancel();终止计时语句不能写在这里
/*
因为 timer 和 TimerTask 的对象,都是线程,会抢夺资源
如果 timer.cancel()先抢到资源,那么定时器就会立刻终止,任务也不会运行
因此这里选择的是将定时器对象传入到 TimerTask 对象中,在任务执行结束后,调用 cancel()终止计时器
*/
timer.schedule(new MyTask(timer),5000);//这里不会有结果,因为定时器已经停止
}
}
class MyTask extends TimerTask{
private Timer timer;
public MyTask(){}
public MyTask(Timer t){
this.timer = t;
}
@Override
public void run() {
System.out.println("时间到了,执行此任务");
timer.cancel();
}
}
结果为
void schedule(TimerTask task, long delay, long period)
package test.MyThread.TimeThread;
import java.util.Timer;
import java.util.TimerTask;
public class TimeDemo2 {
public static void main(String[] args) {
Timer timer = new Timer();
//void schedule(TimerTask task, long delay, long period)
//在指定的延迟时间 delay 后
,执行 task 任务,之后每隔 period 时间后再次执行 task 任务
timer.schedule(new MyTask1(timer),3000,2000);
}
}
class MyTask1 extends TimerTask{
private int count = 0;
private Timer timer;
public MyTask1(){}
public MyTask1(Timer timer){
this.timer = timer;
}
@Override
public void run() {
count++;
System.out.println("时间到了,这时第 "+count+" 次执行此任务");
if(count == 5){
timer.cancel();
}
}
}
结果为
实例
在指定的时间删除指定的文件夹
package test.MyThread.TimeThread;
评论