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

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

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

    細心!用心!耐心!

    吾非文人,乃市井一俗人也,讀百卷書,跨江河千里,故申城一游; 一兩滴辛酸,三四年學業,五六點粗墨,七八筆買賣,九十道人情。

    BlogJava 聯系 聚合 管理
      1 Posts :: 196 Stories :: 10 Comments :: 0 Trackbacks
    Two-phase Termination直譯的話是「兩相終止」,不過就這個模式而言,該譯作「兩階段終止」比較適當,想像您有一個執行緒正在週期性的運作,在「運作階段」您送出了停止執行緒的請求,這時候執行緒不該慌張的馬上終止目前的工作,而是先完成這一次週期的工作,然後進入「善後階段」完成一些善後的工作,例如關閉檔案或網路串流,所謂的兩階段終止,即中止「運作階段」,並完成「善後階段」,完整的完成執行緒的工作。

    以Java的Thread終止而言,不建議您直接使用stop()方法來終止執行緒,stop()方法會丟出ThreadDeath例外強迫執行緒終止,即使執行緒正在運作階段或執行至synchronized區,如果您要終止執行緒,建議自行實作,例如:
      public class SomeThread extends Thread {
        private boolean isTerminated = false;

        public void terminate() {
            isTerminated = true;
        }

        public void run() {
            while(!isTerminated) {
                // ... some statements
            }
        }
     }
     
    考慮到有時執行緒可能會執行至sleep()或wait()而進入Not Runnable狀態,使用上面的方法可能會延遲終止的請求,因而可以在要求終止時再呼叫interrupt()方法,這會丟出 InterruptedException,而使得執行緒從Not Runnable狀態中離開,因此可以改變一下程式:
     public class SomeThread extends Thread {
        private boolean isTerminated = false;

        public void terminate() {
            isTerminated = true;
            interrupt();
        }

        public void run() {
            try {
                while(!isTerminated) {
                    // ... some statements
                }
            }
            catch(InterruptedException e) {
            }
        }
     }
     
    在發出中止請求之後,如果執行緒是在Not Runnable狀態,會丟出InterruptedException,如果這個例外沒有先被捕捉,就會被run()中的catch InterruptedException捕捉,也就是說會直接離開while迴圈,因而如果您在發出終止請求後,要求先執行完這一個週期的工作,您要先捕捉這個例外,若不用完成這一個週期的工作,則不用捕捉這個例外,要如何作取決於您的程式。

    如果執行緒要完成這一個週期的工作,在下一個週期開始之前檢查旗標,這時它的結果是false,所以離開while迴圈,這時候您可以進行一些善後工作,這個可以寫在finally區塊中,例如:
     public class SomeThread extends Thread {
        private boolean isContinue = false;

        public void terminate() {
            isTerminated = true;
            interrupt();
        }

        private void doWorkBeforeShutdown() {
            // .... do some work before shutdown
        }

        public void run() {
            try {
                while(!_isTerminated) {
                    // ... some statements
                }
            }
            catch(InterruptedException e) {
            }
            finally {
                doWorkBeforeShutdown();
            }
        }
     }
     
    上面這個程式大致上就是Two-phase Termination模式的架構,另外如果您的執行緒還服務著其它的物件,則在送出終止請求到完全終止之前,應該停止服務其它物件,您可以讓其它物件要求服務之前,先查詢執行緒是否已被要求終止,這可以藉由提供一個方法來達到:
     public class SomeThread extends Thread {
        private boolean isTerminated = false;

        public void terminate() {
            isTerminated = true;
            interrupt();
        }

        public boolean isTerminated() {
            return _isTerminated;
        }

        private void doWorkBeforeShutdown() {
            // .... do some work before shutdown
        }

        public void run() {
            try {
                while(!_isTerminated) {
                    // ... some statements
                }
            }
            catch(InterruptedException e) {
            }
            finally {
                doWorkBeforeShutdown();
            }
        }
     }
    posted on 2007-04-17 10:58 張金鵬 閱讀(427) 評論(0)  編輯  收藏 所屬分類: 多執行緒模式
    主站蜘蛛池模板: 日日躁狠狠躁狠狠爱免费视频 | 岛国av无码免费无禁网站| 亚洲AV日韩AV永久无码久久| 中文字幕乱码系列免费| 亚洲精品国产精品国自产观看| 国产亚洲综合一区二区三区| 四虎影视精品永久免费| 亚州**色毛片免费观看| 亚洲人成伊人成综合网久久久| a级毛片免费全部播放无码| 国产AV无码专区亚洲AV男同| 久久aa毛片免费播放嗯啊| 少妇中文字幕乱码亚洲影视| 五月亭亭免费高清在线| 涩涩色中文综合亚洲| 免费在线观看你懂的| 黄色视频在线免费观看| 亚洲精品高清国产一久久| www视频在线观看免费| 亚洲日本中文字幕天天更新| 国产免费看插插插视频| 中文日本免费高清| 亚洲五月激情综合图片区| 一本无码人妻在中文字幕免费| 亚洲GV天堂GV无码男同| 亚洲日韩在线观看免费视频| 久久狠狠躁免费观看| 自拍日韩亚洲一区在线| 免费v片在线观看无遮挡| APP在线免费观看视频| 国产成人亚洲精品| 亚洲第一页综合图片自拍| 久久久久免费看黄a级试看| 色婷五月综激情亚洲综合| 亚洲AV无码乱码在线观看| 久久一本岛在免费线观看2020| 亚洲人成色4444在线观看| 亚洲Av综合色区无码专区桃色| 一二三四视频在线观看中文版免费| 永久免费无码网站在线观看个| 亚洲国产午夜精品理论片 |