java 多線程基礎

來源:互聯網
上載者:User

標籤: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 多線程基礎

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.