細(xì)心!用心!耐心!

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

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

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

              public void terminate() {
                  isTerminated = true;
              }

              public void run() {
                  while(!isTerminated) {
                      // ... some statements
                  }
              }
           }
           
          考慮到有時執(zhí)行緒可能會執(zhí)行至sleep()或wait()而進入Not Runnable狀態(tài),使用上面的方法可能會延遲終止的請求,因而可以在要求終止時再呼叫interrupt()方法,這會丟出 InterruptedException,而使得執(zhí)行緒從Not Runnable狀態(tài)中離開,因此可以改變一下程式:
           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) {
                  }
              }
           }
           
          在發(fā)出中止請求之後,如果執(zhí)行緒是在Not Runnable狀態(tài),會丟出InterruptedException,如果這個例外沒有先被捕捉,就會被run()中的catch InterruptedException捕捉,也就是說會直接離開while迴圈,因而如果您在發(fā)出終止請求後,要求先執(zhí)行完這一個週期的工作,您要先捕捉這個例外,若不用完成這一個週期的工作,則不用捕捉這個例外,要如何作取決於您的程式。

          如果執(zhí)行緒要完成這一個週期的工作,在下一個週期開始之前檢查旗標(biāo),這時它的結(jié)果是false,所以離開while迴圈,這時候您可以進行一些善後工作,這個可以寫在finally區(qū)塊中,例如:
           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模式的架構(gòu),另外如果您的執(zhí)行緒還服務(wù)著其它的物件,則在送出終止請求到完全終止之前,應(yīng)該停止服務(wù)其它物件,您可以讓其它物件要求服務(wù)之前,先查詢執(zhí)行緒是否已被要求終止,這可以藉由提供一個方法來達(dá)到:
           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 張金鵬 閱讀(429) 評論(0)  編輯  收藏 所屬分類: 多執(zhí)行緒模式
          主站蜘蛛池模板: 读书| 舒兰市| 沧州市| 新闻| 陇西县| 通州区| 祁连县| 仁化县| 芦溪县| 兴和县| 崇州市| 开封县| 麦盖提县| 十堰市| 蒲城县| 兴和县| 东平县| 白银市| 焦作市| 水富县| 沿河| 烟台市| 惠东县| 嘉峪关市| 无极县| 福州市| 马鞍山市| 仙桃市| 绥宁县| 平顶山市| 雷山县| 乌兰县| 白玉县| 蓝山县| 萍乡市| 平乡县| 林周县| 五常市| 文山县| 乌拉特前旗| 乌拉特中旗|