多線程是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) {
e
printStackTrace();
}
System
out
println(this
getClass()
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