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

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

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

    amp@java

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

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

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

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

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

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

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

    在圖形界面的按鈕監聽事件中,對該對象執行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: 如何讓線程暫停,又能隨時喚醒? 2015-03-31 10:26 watchzerg
    自己定制停止標志位這種方法是有很多不妥的。《effective java》里也很早就說過“當線程在sleep時,無法檢測停止標志位”這種缺陷。作者的建議是在循環中使用“檢測Thread.currentThread().isInterrupted()”來代替“檢測自定義的停止標志位”,需要終止該線程的時候直接調用該線程的interrupt()方法,這樣不管這個線程是sleep還是在檢測循環,都可以幾乎立即優雅的終止執行。  回復  更多評論
      

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

    主站蜘蛛池模板: 亚洲国产精品福利片在线观看| 久久精品国产亚洲网站| 少妇亚洲免费精品| 亚洲AV无码专区国产乱码4SE| 很黄很黄的网站免费的| 免费无码国产V片在线观看| 亚洲av无码av制服另类专区| 久久精品无码一区二区三区免费| 五级黄18以上免费看| 精品日韩亚洲AV无码| 四虎永久免费地址在线网站| 久久大香香蕉国产免费网站| 亚洲AV日韩综合一区尤物| 亚洲精品成人网站在线观看| 成人毛片免费观看视频在线| 18禁超污无遮挡无码免费网站| 亚洲熟妇少妇任你躁在线观看| 国产成人亚洲综合色影视| 性做久久久久免费看| 在线日本高清免费不卡| 免费一级毛片在线播放放视频| 亚洲手机中文字幕| 在线精品亚洲一区二区三区| 永久黄网站色视频免费直播| 久久久久久影院久久久久免费精品国产小说 | 日本免费人成黄页网观看视频 | 国产免费牲交视频免费播放| 亚洲成电影在线观看青青| 国产亚洲av片在线观看播放| 国产人成免费视频| 两性刺激生活片免费视频| 中文字幕日本人妻久久久免费| 精品一区二区三区免费毛片| 亚洲人成伊人成综合网久久| 久久综合日韩亚洲精品色| 亚洲а∨天堂久久精品| 破了亲妺妺的处免费视频国产| 97碰公开在线观看免费视频| 暖暖免费在线中文日本| 国产免费一级高清淫曰本片| 日韩免费高清一级毛片|