Java 多线程 —— 定时器

家电维修 2023-07-16 19:17www.caominkang.com家电维修技术

定时器是一个线程工具,可以用于调度多个定时任务以后台线程的方式运行。
比如说,在开发中,我们需要做一些周期性的操作,比如每隔三分钟就清空一次文件夹,用定闹钟的方式人为的清空肯定是不合适的。这时就可以通过Timer和TimerTask类来实现,定时完成具体任务的功能。

这里需要注意的是,Timer和TimerTask都是线程,Timer是一个计时器,每个Timer对象都是单个后台线程,会依次执行每个任务。

Timer() 创建一个新的计时器

  1. void schedule(TimerTask task, long delay) 在指定的延迟之后安排指定的任务执行。
  2. void schedule(TimerTask task, long delay, long period)
    在指定的延迟之后开始 ,重新执行固定延迟的指定任务(这里的具体任务指括号里面的参数, TimerTask 任务,第一个指定延迟的时间长度是delay,之后的固定延迟时间是period)
  3. 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 = ne Timer();

  //void schedule(TimerTask task, long delay)
  // 在指定的delay延迟时间后,执行task任务
  timer.schedule(ne MyTask(timer),3000); //这里的3000是3000毫秒,即3秒

  //timer.cancel();终止计时语句不能写在这里
  

  timer.schedule(ne 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 = ne Timer();
  //void schedule(TimerTask task, long delay, long period)
  //在指定的延迟时间delay后,执行task任务,之后每隔period时间后执行task任务
  timer.schedule(ne 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;

import java.io.File;
import java.util.Timer;
import java.util.TimerTask;

public class TimerDemo3 {
 public static void main(String[] args) {
  Timer timer = ne Timer();
  timer.schedule(ne MyTask2(timer),3000);
 }
}

class MyTask2 extends TimerTask {
 private Timer timer;
 public MyTask2(){}
 public MyTask2(Timer timer){
  this.timer = timer;
 }
 @Override
 public void run() {
  File file = ne File("D:\java\test1");
  deleteDemo(file);
  timer.cancel();
 }
 public static void deleteDemo(File file){
  File[] files = file.listFiles();
  if(files!=null){
   for(File f : files){
    if(f.isDirectory()){
     deleteDemo(f);
    }
    else{
     System.out.println(f.getName()+"--"+f.delete());
    }
   }
   //将文件夹里面的文件夹和文件都删除后,删除这个文件夹
   file.delete();
  }

 }
}

Copyright © 2016-2025 www.jianfeikang.com 建飞家电维修 版权所有 Power by