<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 60,comments - 71,trackbacks - 0

         在要定時執行某一任務時,在精度不是要求很高的情況下,一般使用Java.util.TimerTask類來完成(要精確度較高的要求下可采用Quarta開源插件),使用
    TimerTask類完成定時任務開發時,很簡單,只需以下二步:
    !)定義一個繼承TimerTask類的類,重寫run()方法,在該方法中實現自已的業務邏輯;
    2)在主類中定義一個Timer類對象,用該對象的schedule()或scheduleAtFixedRate()來實現定時任務的執行(這兩個方法有一定的區別,這里不作介紹);

    這樣就完成了任務的定時執行,其實 TimerTask類也是基于線程(Thread)的實現,所以繼承了TimerTask的類要重寫run()方法,在該方法中實現自已的任務.

    現在有一點要說明下,即在創建Timer類對象時,有兩種方法:
    1)Timer tm = new Timer(); //創建一個非守護線程
    2)Timer tm = new Timer(true);
    //創建一守護線程

    讓timer線程成為一個daemon線程,這樣當程序只有daemon線程的時候,它就會自動終止運行.如果有非守護線程在運行,則守護線程一直存在.
    現舉例如下:
    1)
        public static void main(String[] args) {

            Timer tm 
    = new Timer(true); //創建一守護線程
            tm.schedule(
    new TestTask(),2*1000);
    }
     
    TestTask()類中重寫的run()方法很簡單,只是輸出一條語句,但這段代碼是沒有輸出結果的,因為主線程啟動后就停止了,所以tm這個守護線程就也不存在了,所以沒有輸出結果,現在改下代碼:
    2)
     public static void main(String[] args) {
           
            
    try {
             Thread.sleep(
    6*1000);
            }

            
    catch(Exception e) {
               e.printStackTrace();
            }

            Timer tm 
    = new Timer(true);
            tm.schedule(
    new TestTask(),2*1000);
    }

    但這段代碼也還是沒有輸出的,因為主線程睡眠了6秒鐘后,守護線程才產生,但這時主線程睡眠了6秒鐘后就已經消亡了,所以守護線程就也不存在了,但如果讓主線程睡眠放在schedule()方法后面執行,則就會有輸出,即:
    3)
    Timer tm = new Timer(true);//創建一守護線程

            tm.schedule(
    new TestTask(),2*1000);

            
    try {
                Thread.sleep(
    6*1000);
            }

            
    catch(Exception e) {
                e.printStackTrace();
            }
    這是會有輸出的,因為主線程啟動后,守護線程也啟動了,而主線程睡眠6秒鐘,守護線程過2秒后執行,2秒時間在6秒時間內,所以在主線程消亡之前,守護線程還存在,所以有輸出,但要保證主線程睡眠的時間大于或等于(等于的情況我試過幾次,都有輸出,但不保證一定會有輸出,因為TimerTask有定時不精確的情況)定時任務的時間段(這里是2秒),即如果這里設為7秒或大于6秒的其它值,是不會有輸出的.

    另:這里有幾種情況要說明下:
    1)上面幾種例舉的情況是指創建守護線程(即創建Timer對象時帶true這個參數,如果不帶參數,則表示創建的是非守護線程)的情況,如果創建的是非守護線程,則不管哪種情況,一定會有輸出的.
    2)針對上面幾種情況,如果在調用schedule()方法時,使用的是三個參數的(上面都是帶兩個參數),且第二個參數為0的話,則上面的幾種情況,也都是會有輸出的,因為第二個參數為0的話,表示的意思是立即執行.如上面第二種情況,如果改成這樣:tm.schedule(new TestTask(),0,2*1000);守護線程雖然后是等主線程睡眠6秒主才產生(且這時主線程已經消亡),但產生守護線程時,守護線程立即執行,所以也會能輸出.

    注:守護線程的特點是,只要線程隊列中沒有非守護線程(即普通的我們常見的線程都為非守護線程),則所有的守護線程也將全部消亡.
    創建守護線程的方法是,線程對象調用: threadObj.setDaemon(true);即可將threadObj該線程設為守護線程.
    posted on 2008-05-28 10:01 henry1451 閱讀(728) 評論(0)  編輯  收藏 所屬分類: Java技術
    主站蜘蛛池模板: 亚洲视频在线免费观看| 久久精品国产亚洲综合色| 亚洲av无码一区二区三区天堂古代| 韩国免费a级作爱片无码| 免费大片在线观看网站| 亚洲a无码综合a国产av中文| 毛片a级毛片免费播放100| 亚洲六月丁香婷婷综合| 成**人免费一级毛片| 亚洲国产精品无码久久久秋霞1 | 国产免费直播在线观看视频| 亚洲乱码日产精品一二三| 永久免费观看的毛片的网站| 国产精品久久久久久亚洲小说| 免费人成网站7777视频| 一级一级毛片免费播放| 国产成人精品日本亚洲网站| 88av免费观看入口在线| 精品国产日韩久久亚洲| 国产一级高清免费观看| 97国免费在线视频| 亚洲第一页在线播放| 在线免费观看国产视频| 一本久久A久久免费精品不卡| 奇米影视亚洲春色| 最近中文字幕大全免费视频 | 风间由美在线亚洲一区| 亚洲精品人成无码中文毛片| 免费观看久久精彩视频| 99999久久久久久亚洲| 亚洲国产精品成人久久蜜臀 | 久久精品亚洲男人的天堂| 久久这里只精品热免费99| 亚洲情A成黄在线观看动漫软件 | 美女被免费视频网站a国产| 老妇激情毛片免费| 亚洲色图在线观看| 国产免费AV片无码永久免费| 永久免费AV无码网站国产| 亚洲欧洲日韩极速播放| 亚洲精品无码鲁网中文电影|