日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

java定时器的使用

發布時間:2023/12/15 综合教程 37 生活家
生活随笔 收集整理的這篇文章主要介紹了 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;
        }

    }

}

總結

以上是生活随笔為你收集整理的java定时器的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。