zoukankan      html  css  js  c++  java
  • java定时器的使用

    定时器类Timer在java.util包中。使用时,先实例化,然后使用实例的schedule(TimerTask task, long delay)方法,设定指定的任务task在指定的延迟delay后执行。定时器任务类TimerTask是抽象类,继承并重写其run()方法,可实现具体任务。

    schedule(TimerTask task, Date time)设定指定任务task在指定时间time执行。

    cancel()方法结束这个定时器。

    schedule(TimerTask task, long delay, long period)方法设定指定任务task在指定延迟delay后进行固定延迟peroid的执行。

    scheduleAtFixedRate(TimerTask task, long delay, long period)方法设定指定任务task在指定延迟delay后进行固定频率peroid的执行。

    要实现一个定时任务,运用java中的Timer和TimerTask类可以非常容易实现实时调用处理函数。这两个类使用起来非常方便,可以完成我们对定时器的绝大多数需要。

    看个简单的例子:

    import java.io.IOException;
    import java.util.Timer;
    
    public class TimerTest {
    
    public static void main(String[] args){
    Timer timer = new Timer();
    timer.schedule(new MyTask(), 1000, 2000);//在1秒后执行此任务,每次间隔2秒,如果传递一个Data参数,就可以在某个固定的时间执行这个任务.
    while(true){//这个是用来停止此任务的,否则就一直循环执行此任务了
    try {
    int ch = System.in.read();
    if(ch-'c'==0){
    timer.cancel();//使用这个方法退出任务
    }
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
    
    static class MyTask extends java.util.TimerTask{
    @Override
    public void run() {
    // TODO Auto-generated method stub
    System.out.println("________");
    }
    }
    }

       如果你使用的是JDK 5+,还有一个scheduleAtFixedRate模式可以用,在这个模式下,Timer会尽量的让任务在一个固定的频率下运行,举例说明:在上面的例子中,我们想让MyTask在1秒钟后,每两秒钟执行一次,但是因为java不是实时的(其实java实时性很差.....),所以,我们在上个程序中表达的原义并不能够严格执行.如果我们调用的是scheduleAtFixedRate,那么,Timer会尽量让你的Task执行的频率保持在2秒一次.运行上面的程序,假设使用的是scheduleAtFixedRate,那么下面的场景就是可能的:1秒钟后,MyTask 执行一次,因为系统繁忙,之后的2.5秒后MyTask 才得以执行第二次,然后,Timer记下了这个延迟,并尝试在下一个任务的时候弥补这个延迟,那么,1.5秒后,MyTask 将执行的三次."以固定的频率而不是固定的延迟时间去执行一个任务"

    下面给出一个复杂点的例子,其中告诉大家怎么退出单个TimerTask,怎么退出所有Task

    import java.io.IOException;
    import java.util.Timer;
    
    /*
     * 本类给出了使用Timer和TimerTaske的主要方法,其中包括定制任务,添加任务 退出任务,退出定时器.
     * 因为TimerTask的status域是包级可访问的,所以没有办法在java.util.包外 得到其状态,这对编程造成一些不便
     * .我们不能判断某个Task的状态了.
     */
    
    public class TimerTest {
    
        public static void main(String[] args) {
            Timer timer = new Timer();
            MyTask myTask1 = new MyTask();
            MyTask myTask2 = new MyTask();
            myTask2.setInfo("myTask-2");
            timer.schedule(myTask1, 1000, 2000);
            timer.scheduleAtFixedRate(myTask2, 2000, 3000);
            while (true) {
                try {
    
                    byte[] info = new byte[1024];
                    int len = System.in.read(info);
                    String strInfo = new String(info, 0, len, "GBK");// 从控制台读出信息
                    if (strInfo.charAt(strInfo.length() - 1) == ' ') {
                        strInfo = strInfo.substring(0, strInfo.length() - 2);
                    }
                    if (strInfo.startsWith("Cancel-1")) {
                        myTask1.cancel();// 退出单个任务
                        // 其实应该在这里判断myTask2是否也退出了,是的话就应该break.但是因为无法在包外得到
                        // myTask2的状态,所以,这里不能做出是否退出循环的判断.
                    } else if (strInfo.startsWith("Cancel-2")) {
    
                        myTask2.cancel();
                    } else if (strInfo.startsWith("Cancel-All")) {
    
                        timer.cancel();// 退出Timer
                        break;
                    } else {
                        // 只对myTask1作出判断,偷个懒^_^
                        myTask1.setInfo(strInfo);
                    }
                } catch (IOException e) { // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    
        static class MyTask extends java.util.TimerTask {
            String info = "^_^";
    
            @Override
            public void run() { // TODO Auto-generated method stub
                System.out.println(info);
            }
    
            public String getInfo() {
                return info;
            }
    
            public void setInfo(String info) {
                this.info = info;
            }
    
        }
    
    }
  • 相关阅读:
    JS LeetCode 1423. 可获得的最大点数简单题解
    SpringBoot 学集 (第六章) Docker
    Linux 学记 (第三章)
    Linux 学记 (第二章)
    Linux 学记 (第一章)
    SpringBoot 学集 (第五章) Web开发续
    SpringBoot 学集 (第四章)Web开发
    SpringBoot 学集 (第三章) 日志框架
    SpringBoot 学集 (第二章) 配置文件
    SpringBoot 学集 (第一章)
  • 原文地址:https://www.cnblogs.com/gisblogs/p/3992670.html
Copyright © 2011-2022 走看看