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

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

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

    amp@java

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      99 隨筆 :: 0 文章 :: 228 評論 :: 0 Trackbacks
    做GUI程序的時(shí)候,通常有個(gè)后臺工作線程在努力工作,但是中間又需要一些暫停,而關(guān)閉程序的時(shí)候,必須立即結(jié)束那個(gè)線程,退出程序,也有的時(shí)候需要停止后臺線程,但不關(guān)閉程序。例如,做一個(gè)目錄監(jiān)控程序,發(fā)現(xiàn)目錄中有文件的時(shí)候,執(zhí)行一定的操作,執(zhí)行完之后沒有文件了,就要暫停一下,過幾秒或幾分鐘再次檢測,這時(shí)候就要對線程進(jìn)行暫停操作,如果在暫停的時(shí)候,用戶要關(guān)閉程序,就必須馬上停止線程,如果用戶需要暫停檢測,按下某個(gè)按鈕后,需要讓線程馬上停止,但再次按下某個(gè)按鈕,線程又必須馬上開始。

    以前我都是通過檢測停止標(biāo)記和用Thread.sleep(time)來完成的,后臺線程的每次循環(huán)都要檢查停止標(biāo)記,如果發(fā)現(xiàn)停止標(biāo)記已設(shè)定,就不再循環(huán),退出線程,在線程內(nèi)部,如果需要暫停,就執(zhí)行Thread.sleep(time)。通過把線程的setDaemon(true)方法,還可以讓線程作為后臺線程,當(dāng)圖形界面關(guān)閉后,線程也自動退出。

    但是,這種方式有個(gè)問題,如果我需要在圖形界面上點(diǎn)擊按鈕來停止線程,但并不退出程序,而點(diǎn)擊按鈕的時(shí)候線程正處于sleep狀態(tài),就對它沒有任何辦法,只能讓它醒過來再操作,如果sleep的時(shí)間比較長,例如1分鐘,那么點(diǎn)擊按鈕之后,用戶最多要等1分鐘才能把線程停下來。當(dāng)然,Thread對象有個(gè)interrupt方法,但是已經(jīng)被標(biāo)記為過期,一般不建議使用了。感謝評論中watchzerg的提醒,Thread的interrupt()并沒有標(biāo)記為過期,可以按照他的說法來操作,更為簡單。

    怎么讓線程能暫停,又能隨時(shí)叫醒呢?原來Java里最原始的對象Object就自帶此功能。

    每個(gè)Object都有wait(time)和notify()方法,前者就是讓擁有該Obejct的線程處于暫停狀態(tài),后者則讓線程馬上喚醒,通過這兩個(gè)方法,就能夠滿足上述的所有要求。

    首先,建立一個(gè)同步對象:
    Object syncObj = new Object();

    然后在線程中需要暫停的地方,調(diào)用該對象的wait(time)方法:
    synchronized (syncObj) {
           syncObj.wait(60*1000);
    }

    在圖形界面的按鈕監(jiān)聽事件中,對該對象執(zhí)行notify()方法:
            button_1.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent e) {

                    thread.setStop(true);
                    synchronized (syncObj) {
                            syncObj.notify();
                     }
                    //為了等待線程退出,還可以加上以下語句:
                    thread.join();

                }
            });

    posted on 2015-03-10 16:52 amp@java 閱讀(7692) 評論(2)  編輯  收藏 所屬分類: Java common

    評論

    # re: 如何讓線程暫停,又能隨時(shí)喚醒? 2015-03-31 10:26 watchzerg
    自己定制停止標(biāo)志位這種方法是有很多不妥的。《effective java》里也很早就說過“當(dāng)線程在sleep時(shí),無法檢測停止標(biāo)志位”這種缺陷。作者的建議是在循環(huán)中使用“檢測Thread.currentThread().isInterrupted()”來代替“檢測自定義的停止標(biāo)志位”,需要終止該線程的時(shí)候直接調(diào)用該線程的interrupt()方法,這樣不管這個(gè)線程是sleep還是在檢測循環(huán),都可以幾乎立即優(yōu)雅的終止執(zhí)行。  回復(fù)  更多評論
      

    # re: 如何讓線程暫停,又能隨時(shí)喚醒? 2015-04-02 16:48 amp@java
    @watchzerg
    非常感謝,原來我記錯(cuò)了,我還以為interrupt()方法已經(jīng)被標(biāo)記為過期了。  回復(fù)  更多評論
      

    主站蜘蛛池模板: 成年女人毛片免费播放人| 亚洲日本乱码在线观看| 一区二区三区免费在线视频| 亚洲国产AV无码专区亚洲AV| 69天堂人成无码麻豆免费视频| 亚洲妇女无套内射精| 亚洲欧洲无码AV电影在线观看| 手机在线看永久av片免费| 一级毛片试看60分钟免费播放| 亚洲第一精品福利| 国产又大又黑又粗免费视频| a级男女仿爱免费视频| 亚洲精品精华液一区二区| 亚洲av无码不卡| 国产一区二区三区在线观看免费| 久久精品无码精品免费专区| 亚洲精品中文字幕无码A片老| 亚洲精品无码成人AAA片| 免费涩涩在线视频网| 日韩精品人妻系列无码专区免费 | 国产精品亚洲专一区二区三区| 亚洲av无码av制服另类专区| 国产无遮挡裸体免费视频| 亚洲免费视频网站| 无码毛片一区二区三区视频免费播放 | 日韩在线免费视频| 特级做A爰片毛片免费看无码| 亚洲乱码中文字幕在线| 亚洲av永久无码精品秋霞电影影院| 国产成人免费a在线视频色戒| 69免费视频大片| a级毛片在线视频免费观看| 亚洲AⅤ男人的天堂在线观看| 亚洲视频在线观看不卡| 亚洲人成色777777在线观看| 内射无码专区久久亚洲| 永久免费AV无码国产网站| 在线美女免费观看网站h| 嫩草在线视频www免费看| 日韩a毛片免费观看| 亚洲偷自拍另类图片二区|