標籤:tor 死結 pen cpu current boolean cat rate com
線程是進程內的執行單元,進程當中都有若干個線程。
通常主線程或進程是阻塞式的按順序執行的,如果希望非同步執行些子任務,而不要阻塞當前線程的執行,即需要建立子線程,子線程建立後主線程可以等待它們的結果,得到它們的結果後進行其它的操作,但也可以不管它,讓它自生自滅。
下面具體看下怎樣建立多線程與如何讓子主線程互動:
1、到底是start還是run
直接調用run方法是無法開啟一個新線程的,應該調用start方法,start方法其實是在一個新的作業系統線程上面去調用run方法。換句話說,直接調用run方法而不是調用start方法的話,它並不會開啟新的線程,而是在調用run的當前的線程當中執行你的操作,例如:
Thread thread = new Thread("t1"){ @Override public void run() { // TODO Auto-generated method stub System.out.println(Thread.currentThread().getName()); }};thread.start();//這樣會輸出 "t1" thread.run();//這樣會輸出 "main",沒有開啟新的線程2、終止線程
Thread.stop() 不推薦使用。它會釋放所有monitor,stop方法太過”暴力”了,無論線程執行到哪裡,它將會立即停止掉線程。
3、線程中斷
相比終止線程,更應該使用的是中斷線程。
中斷是一種協作機制。也就是說調用線程對象的interrupt方法並不一定就中斷了正在啟動並執行線程,它只是要求線程自己在合適的時機中斷自己。每個線程都有一個boolean的中斷狀態(不一定就是對象的屬性,事實上,該狀態也確實不是Thread的欄位),interrupt方法僅僅只是將該狀態置為true。對於非阻塞中的線程, 只是改變了中斷狀態, 即Thread.isInterrupted()將返回true,並不會使程式停止;
4、線程掛起
掛起(suspend)和繼續執行(resume)線程
- suspend()不會釋放鎖
- 如果加鎖發生在resume()之前 ,則死結發生
這兩個方法都是Deprecated方法,不推薦使用。
原因在於,suspend不釋放鎖,因此沒有線程可以訪問被它鎖住的臨界區資源,直到被其他線程resume。因為無法控制線程啟動並執行先後順序,如果其他線程的resume方法先被運行,那則後啟動並執行suspend,將一直佔有這把鎖,造成死結發生。
5、join和yeild
yeild是個native靜態方法,這個方法是想把自己佔有的cpu時間釋放掉,然後和其他線程一起競爭(注意yeild的線程還是有可能爭奪到cpu,注意與sleep區別)。在javadoc中也說明了,yeild是個基本不會用到的方法,一般在debug和test中使用。
join方法的意思是等待其他線程結束,就如suspend那節的代碼,想讓主線程等待t1,t2結束以後再結束。沒有結束的話,主線程就一直阻塞在那裡。
join()方法也可以傳遞一個時間,意為有限期地等待,超過了這個時間就自動喚醒。
6、守護線程
setDaemon(true);就可以將線程設定為守護線程
守護線程就是在後台默默地完成一些系統性的服務,比如記憶體回收線程、JIT線程就可以理解為守護線程。
7、線程優先順序
Thread類中有3個變數定義了線程優先順序。
public final static int MIN_PRIORITY = 1;
public final static int NORM_PRIORITY = 5;
public final static int MAX_PRIORITY = 10;
讓一個高優先順序的線程和低優先順序的線程同時爭奪一個鎖,看看哪個最先完成。
當然並不一定是高優先順序一定先完成。再多次運行後發現,高優先順序完成的機率比較大,但是低優先順序還是有可能先完成的。
8. 基本的線程同步操作
synchronized 和 Object.wait() Obejct.notify()
參考文章:http://www.importnew.com/21239.html
java 多線程基礎