<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

         在要定時(shí)執(zhí)行某一任務(wù)時(shí),在精度不是要求很高的情況下,一般使用Java.util.TimerTask類(lèi)來(lái)完成(要精確度較高的要求下可采用Quarta開(kāi)源插件),使用
    TimerTask類(lèi)完成定時(shí)任務(wù)開(kāi)發(fā)時(shí),很簡(jiǎn)單,只需以下二步:
    !)定義一個(gè)繼承TimerTask類(lèi)的類(lèi),重寫(xiě)run()方法,在該方法中實(shí)現(xiàn)自已的業(yè)務(wù)邏輯;
    2)在主類(lèi)中定義一個(gè)Timer類(lèi)對(duì)象,用該對(duì)象的schedule()或scheduleAtFixedRate()來(lái)實(shí)現(xiàn)定時(shí)任務(wù)的執(zhí)行(這兩個(gè)方法有一定的區(qū)別,這里不作介紹);

    這樣就完成了任務(wù)的定時(shí)執(zhí)行,其實(shí) TimerTask類(lèi)也是基于線程(Thread)的實(shí)現(xiàn),所以繼承了TimerTask的類(lèi)要重寫(xiě)run()方法,在該方法中實(shí)現(xiàn)自已的任務(wù).

    現(xiàn)在有一點(diǎn)要說(shuō)明下,即在創(chuàng)建Timer類(lèi)對(duì)象時(shí),有兩種方法:
    1)Timer tm = new Timer(); //創(chuàng)建一個(gè)非守護(hù)線程
    2)Timer tm = new Timer(true);
    //創(chuàng)建一守護(hù)線程

    讓timer線程成為一個(gè)daemon線程,這樣當(dāng)程序只有daemon線程的時(shí)候,它就會(huì)自動(dòng)終止運(yùn)行.如果有非守護(hù)線程在運(yùn)行,則守護(hù)線程一直存在.
    現(xiàn)舉例如下:
    1)
        public static void main(String[] args) {

            Timer tm 
    = new Timer(true); //創(chuàng)建一守護(hù)線程
            tm.schedule(
    new TestTask(),2*1000);
    }
     
    TestTask()類(lèi)中重寫(xiě)的run()方法很簡(jiǎn)單,只是輸出一條語(yǔ)句,但這段代碼是沒(méi)有輸出結(jié)果的,因?yàn)橹骶€程啟動(dòng)后就停止了,所以tm這個(gè)守護(hù)線程就也不存在了,所以沒(méi)有輸出結(jié)果,現(xiàn)在改下代碼:
    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);
    }

    但這段代碼也還是沒(méi)有輸出的,因?yàn)橹骶€程睡眠了6秒鐘后,守護(hù)線程才產(chǎn)生,但這時(shí)主線程睡眠了6秒鐘后就已經(jīng)消亡了,所以守護(hù)線程就也不存在了,但如果讓主線程睡眠放在schedule()方法后面執(zhí)行,則就會(huì)有輸出,即:
    3)
    Timer tm = new Timer(true);//創(chuàng)建一守護(hù)線程

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

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

            
    catch(Exception e) {
                e.printStackTrace();
            }
    這是會(huì)有輸出的,因?yàn)橹骶€程啟動(dòng)后,守護(hù)線程也啟動(dòng)了,而主線程睡眠6秒鐘,守護(hù)線程過(guò)2秒后執(zhí)行,2秒時(shí)間在6秒時(shí)間內(nèi),所以在主線程消亡之前,守護(hù)線程還存在,所以有輸出,但要保證主線程睡眠的時(shí)間大于或等于(等于的情況我試過(guò)幾次,都有輸出,但不保證一定會(huì)有輸出,因?yàn)門(mén)imerTask有定時(shí)不精確的情況)定時(shí)任務(wù)的時(shí)間段(這里是2秒),即如果這里設(shè)為7秒或大于6秒的其它值,是不會(huì)有輸出的.

    另:這里有幾種情況要說(shuō)明下:
    1)上面幾種例舉的情況是指創(chuàng)建守護(hù)線程(即創(chuàng)建Timer對(duì)象時(shí)帶true這個(gè)參數(shù),如果不帶參數(shù),則表示創(chuàng)建的是非守護(hù)線程)的情況,如果創(chuàng)建的是非守護(hù)線程,則不管哪種情況,一定會(huì)有輸出的.
    2)針對(duì)上面幾種情況,如果在調(diào)用schedule()方法時(shí),使用的是三個(gè)參數(shù)的(上面都是帶兩個(gè)參數(shù)),且第二個(gè)參數(shù)為0的話,則上面的幾種情況,也都是會(huì)有輸出的,因?yàn)榈诙€(gè)參數(shù)為0的話,表示的意思是立即執(zhí)行.如上面第二種情況,如果改成這樣:tm.schedule(new TestTask(),0,2*1000);守護(hù)線程雖然后是等主線程睡眠6秒主才產(chǎn)生(且這時(shí)主線程已經(jīng)消亡),但產(chǎn)生守護(hù)線程時(shí),守護(hù)線程立即執(zhí)行,所以也會(huì)能輸出.

    注:守護(hù)線程的特點(diǎn)是,只要線程隊(duì)列中沒(méi)有非守護(hù)線程(即普通的我們常見(jiàn)的線程都為非守護(hù)線程),則所有的守護(hù)線程也將全部消亡.
    創(chuàng)建守護(hù)線程的方法是,線程對(duì)象調(diào)用: threadObj.setDaemon(true);即可將threadObj該線程設(shè)為守護(hù)線程.
    posted on 2008-05-28 10:01 henry1451 閱讀(728) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Java技術(shù)
    主站蜘蛛池模板: 亚洲精品无码久久久久久久| 99国产精品视频免费观看| 亚洲综合伊人制服丝袜美腿| 国产亚洲精aa成人网站| 国产成人精品免费直播| 一二三四免费观看在线电影 | 亚洲性日韩精品国产一区二区| 嫖丰满老熟妇AAAA片免费看| 精品国产麻豆免费人成网站| CAOPORM国产精品视频免费| 亚洲欧美第一成人网站7777| 亚洲国产精品一区二区久| 亚洲AV无码AV男人的天堂| 国产亚洲精品精华液| 亚洲精品第一国产综合境外资源 | 亚洲日韩在线视频| 亚洲精品在线观看视频| 久久久久亚洲AV成人网人人网站 | 亚洲xxxx18| 亚洲乱码一二三四五六区| 99久久亚洲综合精品成人网| 亚洲国产精品婷婷久久| 亚洲av伊人久久综合密臀性色| 自拍偷自拍亚洲精品被多人伦好爽| 亚洲国产成人久久精品99| 免费一区二区三区四区五区| 免费看一级做a爰片久久| 国产成人精品男人免费| 国产成人免费片在线视频观看| 日韩免费视频一区| 日本一道高清不卡免费| 国产女高清在线看免费观看| 国产无遮挡吃胸膜奶免费看 | 亚洲人成网站免费播放| 亚洲国产精品成人综合色在线| 亚洲免费综合色在线视频| 亚洲国产av玩弄放荡人妇| 亚洲AV无码一区二区三区电影| 色综合久久精品亚洲国产| 欧亚一级毛片免费看| 一级白嫩美女毛片免费|