2012年11月5日 星期一

thread關閉

這一星期多  雖然沒有達到原本預期的目標
但還是學到了不少新東西
也把之前的程式又重新整理了"幾"遍
同樣把一些心得紀錄一下

首先是Thread的關閉方式
原本的Thread除了以start()開始以外
可以用stop()這個函式將Thread關閉
但是不知道在哪一版的Java開始
為了安全性的一些問題
stop()就被移除了
因此   Thread只有在一種狀況下會關閉
也就是當該Thread完成了所負責的工作run()以後
才能不留遺憾安心的前往那個世界了...


只是一般在使用Thread時
常常在run()裡面以無窮迴圈的方式撰寫
既然不能用stop()來關閉
就必須另外設計一些機制來控制Thread的關閉
於是從網路上找到了以下三種主要的控制方式

1.設定flag
用一個boolean變數來決定是否關閉
當每次while迴圈內的程式完成時
檢查一次該flag   判定是否繼續下一次的while迴圈
這種作法還滿直覺的
也能夠確保while迴圈中的工作不會被執行到一半就中斷
但是遇到像是socket讀取資料或是wait之類的等待狀況時
這種方式就無效了

2.interrupt
當Thread中執行到sleep()或wait()進入等待狀態時
可以針對該thread執行interrupt()來中斷等待並產生Exception
因此只要抓住InterruptedException
便能夠得知該thread是被中斷而跳出的

3.close
如果thread執行到socket等i/o而進入等待時
interrupt無法使其中斷跳出
但是可以改以i/o class本身的close()
強制關閉其i/o後
原本等待讀取中的程式便會中斷
產生Exception跳出

4.自己塞停止指令!
這邊是自己寫的一個很笨的方式
因為在程式中用到一個同步化的Task
來擺放所有的指令
當指令Task中長度為0時
會不斷的進行wait  因此無法interrupt跳出迴圈
由於這段是偷來的程式碼
所以能盡量不改就不去動它
也就因此另外寫了一個方式來中斷
當需要中斷該thread時
送出一個"中斷用"指令  硬塞到Task中
並在讀取到指令時  判定指令是否為"中斷用"指令
如果是  就主動進行break  跳出迴圈
其實也是個很直觀的方法
感覺有點笨笨的

最近還要繼續改寫
把socket連線的部分包得更完成
更適合用來開發遊戲
有更多進度後再來發文

沒有留言 :

張貼留言