熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

關於線程的停止問題

2022-06-13   來源: Java高級技術 

  多線程是java的一個優勢java使得程序員可以很方便的進行多線程程序開發獲得更好的性能
  關於多線程的概念以及一般的多線程編程比如如何以及為何實現runnable接口為何stop()會被Deprecated掉等等這個請看matrix之前的多線程編程基礎或者sun的java文檔
  關於多線程編程有幾點這裡要提到的
  既然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()) {
  code
  code
  //put your code here
  }
  }
  }
  catch (IOException e) {
  eprintStackTrace();
  }
  Systemoutprintln(thisgetClass()getName()+ stopped);
  }
  
  //skip some code
  }
  
  
  這樣每當需要停止該線程時只需調用stopthread()即可
  
  這裡有兩點需要注意
  
  )我們用了一個同步方法getrunflag()來得到當前的狀態為什麼用這個方法而不是直接使用while(runflag)呢?
  這個是因為在java的多線程模型中有一個公共的對象存儲區但是每個對象都有自己的私有備份當一個線程改變了狀態jvm並不能保證這個線程改變過的變量即時更新公共對象存儲區的狀態可能(可能性不大)造成問題
  所以建議有好的設計習慣采用同步方法來獲得當前的runflag值
  
  )還有一點特別是涉及網絡的多線程如果發生了網絡阻塞(在while循環裡面發生)那麼即使runflag狀態比如改變成false由於程序被阻塞線程用這種方法是永遠都不會被停止的
  舉個例子比如上面的程序如果code是一段網絡程式如果在code發生了阻塞阻塞的意義就是得不到請求的資源在無限期等待這個時候runflag狀態的變化對while循環是起不了作用的線程不會被停止
  筆者曾經參與多個涉及到獲取網絡資源的java程式經常遇到因為網絡的阻塞引起的線程問題
  如果你的程式可能涉及到網絡阻塞或者有可能發生某種消息接受的阻塞那麼請不要用這種方法來停止線程
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27657.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.