Java线程Timer定时器用法详细总结

定时/计划功能主要使用的就是Timer对象,它在内部还是使用多线程的方式进行处理,所以它和线程技术还是有非常大的关联。

Timer类主要作用就是设置计划任务,但封装任务的类却是TimerTask类。TimerTask类是一个抽象类。

执行任务的时间晚于当前时间-----在未来执行的效果

import java.util.Date;

import java.util.TimerTask;

public class MyTask extends TimerTask{

  @Override

  public void run() {

    System.out.println("任务执行了, 时间为:" + new Date());

  }

}

public class Test1 {

  public static void main(String[] args){

    System.out.println("当前时间为: " + new Date());

    Calendar calendarRef = Calendar.getInstance();

    calendarRef.add(Calendar.SECOND, 10);

    Date runDate = calendarRef.getTime();

    MyTask task = new MyTask();

    // 查看Timer构造方法,创建一个Timer就是启动一个新的线程

    Timer timer = new Timer();

    timer.schedule(task, runDate); // 定时器在某个时间(runDate)执行某个任务(task)

  }

}

Timer中允许有多个TimerTask任务及延时的测试

TimerTask是以队列的方式一个一个被顺序性地执行,所以执行时间有可能和预期的时间不一致,因为前面的任务有可能消耗的时间较长,则后面的任务运行的时间也被延后。

import java.util.Date;

import java.util.TimerTask;

public class MyTaskA extends TimerTask{

  @Override

  public void run() {

    try {

      System.out.println("A begin timer, 时间为:" + new Date());

      Thread.sleep(20000);

      System.out.println("A  end timer, 时间为:" + new Date());

    } catch (InterruptedException e) {

      e.printStackTrace();

    }

  }

}

import java.util.Date;

import java.util.TimerTask;

public class MyTaskB extends TimerTask{

  @Override

  public void run() {

    System.out.println("B begin timer, 时间为:" + new Date());

    System.out.println("B  end timer, 时间为:" + new Date());

  }

}

import java.util.Calendar;

import java.util.Date;

import java.util.Timer;

public class Test1 {

  public static void main(String[] args){

    System.out.println("当前时间为: " + new Date());

    Calendar calendarRef1 = Calendar.getInstance();

    Date runDate1 = calendarRef1.getTime();

    System.out.println("A计划时间为: " + runDate1);

    Calendar calendarRef2 = Calendar.getInstance();

    calendarRef2.add(Calendar.SECOND, 10);

    Date runDate2 = calendarRef2.getTime();

    System.out.println("B计划时间为: " + runDate2);

    MyTaskA task1 = new MyTaskA();

    MyTaskB task2 = new MyTaskB();

    Timer timer = new Timer();

    timer.schedule(task1, runDate1); // 定时器在某个时间(runDate)执行某个任务(task)

    timer.schedule(task2, runDate2);

  }

}

schedule(TimerTask task, Date firstTime, long period)

该方法的作用是在指定的日期之后按指定的间隔周期,无限循环地执行某一任务。

import java.util.Date;

import java.util.TimerTask;

public class MyTask extends TimerTask{

  @Override

  public void run() {

    System.out.println("任务开始: "+new Date());

    System.out.println("mytask...");

    System.out.println("任务结束: "+new Date());

  }

}

import java.util.Calendar;

import java.util.Date;

import java.util.Timer;

public class Run {

  public static void main(String[] args){

    System.out.println("当前时间为:"+new Date());

    Calendar c = Calendar.getInstance();

    c.add(Calendar.SECOND, 10);

    Date runDate1 = c.getTime();

    System.out.println("计划时间为:"+runDate1);

    MyTask myTask = new MyTask();

    Timer timer = new Timer();

    timer.schedule(myTask, runDate1, 10000);

  }

}

TimerTask类的cancel()方法

TimerTask类中的cancel()方法的作用是将自身从任务队列中进行清除.

import java.util.Date;

import java.util.TimerTask;

public class MyTaskA extends TimerTask{

  @Override

  public void run() {

    System.out.println("A run timer="+new Date());

    this.cancel();

    System.out.println("A任务自己移除自己");

  }

}

import java.util.Date;

import java.util.TimerTask;

public class MyTaskB extends TimerTask{

  @Override

  public void run() {

    System.out.println("B run timer="+new Date());

  }

}

import java.util.Calendar;

import java.util.Date;

import java.util.Timer;

public class Run {

  public static void main(String[] args){

    System.out.println("当前时间为:"+new Date());

    Calendar c = Calendar.getInstance();

    Date runDate1 = c.getTime();

    System.out.println("计划时间为:"+runDate1);

    MyTaskA myTaskA = new MyTaskA();

    MyTaskB myTaskB = new MyTaskB();

    Timer timer = new Timer();

    timer.schedule(myTaskA, runDate1, 4000);

    timer.schedule(myTaskB, runDate1, 4000);

  }

}

Timer的cancel()方法

和TimerTask类中的cancel()方法清除自身不同,Timer类中的cancel()方法作用是将任务队列中全部的任务进行清空。

import java.util.Date;

import java.util.TimerTask;

public class MyTaskA extends TimerTask{

  @Override

  public void run() {

    System.out.println("A run timer="+new Date());

    this.cancel();

    System.out.println("A任务自己移除自己");

  }

}

import java.util.Date;

import java.util.TimerTask;

public class MyTaskB extends TimerTask{

  @Override

  public void run() {

    System.out.println("B run timer="+new Date());

  }

}

import java.util.Calendar;

import java.util.Date;

import java.util.Timer;

public class Run {

  public static void main(String[] args){

    System.out.println("当前时间为:"+new Date());

    Calendar c = Calendar.getInstance();

    Date runDate1 = c.getTime();

    System.out.println("计划时间为:"+runDate1);

    MyTaskA myTaskA = new MyTaskA();

    MyTaskB myTaskB = new MyTaskB();

    Timer timer = new Timer();

    timer.schedule(myTaskA, runDate1, 4000);

    timer.schedule(myTaskB, runDate1, 4000);

  }

}

schedule(TimerTask task, long delay)

该方法的作用是以执行schedule(TimerTask task, long delay)方法当前的时间为参考时间,在此时间基础上延迟指定的毫秒数后执行一次TimerTask任务。

import java.util.Date;

import java.util.TimerTask;

public class MyTask extends TimerTask{

  @Override

  public void run() {

    System.out.println("A run timer="+new Date());

  }

}

import java.util.Calendar;

import java.util.Date;

import java.util.Timer;

public class Run {

  public static void main(String[] args) throws InterruptedException{

    System.out.println("当前时间为:"+new Date());

    Calendar c = Calendar.getInstance();

    Date runDate1 = c.getTime();

    System.out.println("计划时间为:"+runDate1);

    MyTask myTask = new MyTask();

    Timer timer = new Timer();

    timer.schedule(myTask, 7000); // 计划任务延迟7秒后执行

    Thread.sleep(10000);

    timer.cancel();

  }

}

以上就是Java线程之Timer定时器的详细内容,希望我们整理的内容能够帮助到大家。

(0)

相关推荐

  • java多线程之定时器Timer的使用详解

    定时的功能我们在手机上见得比较多,比如定时清理垃圾,闹钟,等等.定时功能在java中主要使用的就是Timer对象,他在内部使用的就是多线程的技术. Time类主要负责完成定时计划任务的功能,就是在指定的时间的开始执行某个任务. Timer类的作用是设置计划任务,而封装任务内容的类是TimerTask类.此类是一个抽象类,继承需要实现一个run方法. 通过查文档我们看到Timer有以下几个构造函数: Timer的方法以下这么多: 下面我们通过定时器来完成一个简单功能,就是在运行项目三秒后,在控制台

  • Java多线程定时器Timer原理及实现

    前言 定时/计划功能在Java应用的各个领域都使用得非常多,比方说Web层面,可能一个项目要定时采集话单.定时更新某些缓存.定时清理一批不活跃用户等等.定时计划任务功能在Java中主要使用的就是Timer对象,它在内部使用多线程方式进行处理,所以它和多线程技术关联还是相当大的.那和ThreadLocal一样,还是先讲原理再讲使用,Timer的实现原理不难,就简单扫一下就好了. Timer的schedule(TimeTask task, Date time)的使用 该方法的作用是在执行的日期执行一

  • Java 定时器(Timer)及线程池里使用定时器实例代码

    java Timer定时器 简单实例代码: public class Test { public static void main(String[] args) { // Timer定时器 Timer mTimer = new Timer(); MyTack myTack = new MyTack(); mTimer.schedule(myTack, 2000, 3000);//第一个参数是需要执行的任务 第二个参数是延迟多少时间最开始执行,第三个参数是执行完后多少时间后进行再次执行是一个周期性

  • Java线程Timer定时器用法详细总结

    定时/计划功能主要使用的就是Timer对象,它在内部还是使用多线程的方式进行处理,所以它和线程技术还是有非常大的关联. Timer类主要作用就是设置计划任务,但封装任务的类却是TimerTask类.TimerTask类是一个抽象类. 执行任务的时间晚于当前时间-----在未来执行的效果 import java.util.Date; import java.util.TimerTask; public class MyTask extends TimerTask{ @Override public

  • Java线程池Executor用法详解

    目录 线程池类图 线程池的好处 new Thread的弊端 线程池核心类-ThreadPoolExecutor 使用Executors创建线程池 Executors.newCachedThreadPool Executors.newSingleThreadExecutor Executors.newFixedThreadPool Executors.newScheduledThreadPool 总结 如何定义线程池参数 线程池类图 我们最常使用的Executors实现创建线程池使用线程主要是用上

  • C#中timer定时器用法实例

    本文实例讲述了C#中timer定时器用法.分享给大家供大家参考.具体如下: 下面的代码通过Timer定时器每隔1000毫秒(1秒)触发一次事件 using System; using System.Timers; class TestTimer { public static void Main () { Timer timer = new Timer(); timer.Elapsed + = new ElapsedEventHandler(DisplayTimeEvent); timer.In

  • Java线程让步yield用法实例分析

    本文实例讲述了Java线程让步yield用法.分享给大家供大家参考,具体如下: 一 点睛 yield()方法是一个和sleep()方法有点类似的方法,它是Thread类提供的一个静态方法,它也可以让当前正在执行的线程暂停,但它不会阻塞该线程,它只是让线程转入就绪状态.yield只是让当前线程暂停一下,让系统的线程调度器重新调度一次,完全可能的情况是:当某个线程调用了yield()方法后,线程调度器又将其调度出来重新执行. 当某个线程调用了yield方法暂停之后,只有优先级与当前线程相同,或者优先

  • Java线程的联合用法实例分析

    本文实例讲述了Java线程的联合用法.分享给大家供大家参考,具体如下: 一 点睛 在Java中,线程控制提供了join()方法.该方法的功能是把指定的线程加入到当前线程,从而实现将两个交替执行的线程,合并为顺序执行的线程.比方说,在线程A中调用了线程B的join()方法,线程A就会立刻挂起(suspend),一直等下去,直到它所联合的线程B执行完毕为止,A线程才重新排队等待CPU资源,以便恢复执行.这种策略通常会在main()主线程内,用以等待其他线程完成后,再结束main()主线程. 二 代码

  • Java中Timer的用法详解

    现在项目中用到需要定时去检查文件是否更新的功能.timer正好用于此处. 用法很简单,new一个timer,然后写一个timertask的子类即可. 代码如下: package comz.autoupdatefile; import java.util.Timer; import java.util.TimerTask; public class M { public static void main(String[] args) { // TODO todo.generated by zoer

  • java中Timer定时器的使用和启动方式

    目录 Timer定时器的使用和启动 1.概述 2.应用场景 3.使用方法 4.启动方法 java的几种定时器小结 1.@Scheduled注解 2.quartz 3.使用Timer 4.使用线程控制 Timer定时器的使用和启动 1.概述 定时计划任务功能在Java中主要使用的就是Timer对象,它在内部使用多线程的方式进行处理,所以它和多线程技术还是有非常大的关联的.在JDK中Timer类主要负责计划任务的功能,也就是在指定的时间开始执行某一个任务,但封装任务的类却是TimerTask类. 2

  • Java 线程的生命周期详细介绍及实例代码

    当线程被创建并启动之后,它既不是一启动就进入执行状态,也不是一直处于执行状态,在其生命周期中,要经过"新建(New)"."就绪(Runnable)"."运行(Running')"."阻塞(Blocked)"和"死亡(Dead)"五种状态.线程在创建之后,不可能一直霸占着CPU独立运行,需要在多个线程之间切换,所以大部分时间处于运行.阻塞之间切换.  一.线程的状态 线程的存在有几种不同的状态,如下: New

  • Java线程同步实例分析

    本文实例讲述了Java线程同步的用法.分享给大家供大家参考.具体分析如下: 多线程的使用为我们的程序提供了众多的方便,同时它也给我们带来了以往没有考虑过的麻烦.当我们使用多线程处理共享资源时意外将会发生:比如我们一起外出就餐,每个人都是一个线程,餐桌上的食物则是共享资源,当我看到红烧鸡腿上桌后立即拿起筷子直奔目标,眼看着就得手的时候,突然---鸡腿消失了,一个距离盘子更近的线程正在得意地啃着. 为了避免上述问题的发生,Java为我们提供了"synchronized(同步化)修饰符"来避

  • 详解Java线程同步器CountDownLatch

    Java程序有的时候在主线程中会创建多个线程去执行任务,然后在主线程执行完毕之前,把所有线程的任务进行汇总,以前可以用线程的join方法,但是这个方法不够灵活,我们可以使用CountDownLatch类,实现更优雅,而且使用线程池的话,可没有办法调用线程的join方法的呀! 一.简单使用CountDownLatch 直接使用线程: package com.example.demo.study; import java.util.concurrent.CountDownLatch; public

随机推荐