Dict.CN 在線詞典, 英語學習, 在線翻譯

          都市淘沙者

          荔枝FM Everyone can be host

          統計

          留言簿(23)

          積分與排名

          優秀學習網站

          友情連接

          閱讀排行榜

          評論排行榜

          關于線程的停止問題

          多線程是java的一個優勢,java使得程序員可以很方便的進行多線程程序開發。獲得更好的性能。
          關于多線程的概念以及一般的多線程編程,比如如何以及為何實現runnable接口,為何stop()會被Deprecated掉等等,這個請看matrix之前的多線程編程基礎或者sun的java文檔。
          關于多線程編程,有幾點這里要提到的:
          1。既然stop()是不被推薦的,那么我們如何停止一個線程呢?直接kill嗎?在這里,筆者總結一種比較通用也比較穩定的方法:

          class threadtest extend Thread{
          //skip some code..


          boolean runflag=true;

          public synchronized void stopthread()
          {
          runflag=false;
          }

          public synchronized boolean getrunflag()
          {
          return runflag;
          }

          public void run() {
          runflag=true;
          try {
          while (getrunflag()) {
          code1;
          code2;
          //put your code here
          }
          }
          }
          catch (IOException e) {
          e.printStackTrace();
          }
          System.out.println(this.getClass().getName()+" stopped");
          }

          //skip some code..
          }


          這樣,每當需要停止該線程時,只需調用stopthread()即可。

          這里有兩點需要注意:

          1)我們用了一個同步方法getrunflag()來得到當前的狀態,為什么用這個方法而不是直接使用while(runflag)呢?
          這個是因為在java的多線程模型中,有一個公共的對象存儲區,但是每個對象都有自己的私有備份,當一個線程改變了狀態,jvm并不能保證這個線程改變過的變量即時更新公共對象存儲區的狀態,可能(可能性不大)造成問題。
          所以建議有好的設計習慣,采用同步方法來獲得當前的runflag值。

          2)還有一點,特別是涉及網絡的多線程,如果發生了網絡阻塞(在while循環里面發生),那么,即使runflag狀態比如改變成false,由于程序被阻塞,線程用這種方法是永遠都不會被停止的。
          舉個例子:比如上面的程序,如果code1是一段網絡程式,如果在code1發生了阻塞,阻塞的意義就是得不到請求的
          資源,在無限期等待,這個時候,runflag狀態的變化對while循環是起不了作用的,線程不會被停止。
          筆者曾經參與多個涉及到獲取網絡資源的java程式,經常遇到因為網絡的阻塞引起的線程問題。
          如果你的程式可能涉及到網絡阻塞,或者有可能發生某種消息接受的阻塞。那么,請不要用這種方法來停止線程。具體方法請看筆者另外一片文章:高級多線程編程(二)-多線程中的監控與超時問題。

          posted on 2007-09-09 18:24 都市淘沙者 閱讀(735) 評論(0)  編輯  收藏 所屬分類: Java Basic/Lucene/開源資料

          主站蜘蛛池模板: 河东区| 嘉禾县| 鞍山市| 信宜市| 陆川县| 曲麻莱县| 璧山县| 基隆市| 嘉义县| 万安县| 徐水县| 邵东县| 九江县| 榆中县| 抚松县| 赤城县| 拜城县| 土默特右旗| 梁山县| 南城县| 清流县| 肃北| 阿合奇县| 温宿县| 郓城县| 茶陵县| 马鞍山市| 洛川县| 沂水县| 安多县| 临朐县| 贵南县| 海宁市| 江津市| 香港| 新安县| 犍为县| 互助| 沧州市| 武夷山市| 漯河市|