Java多線程編程

來源:互聯網
上載者:User

      Java的線程類可以有兩個選擇:一個是擴充Thread類,然後重裝它的run方法;另一個是實現Runnable類,實現它的的run方法,然後用new Thread(實現Runnable的類)方法產生對應的線程對象。關於該線程的操作在run方法中實現。

      線程的運行是調用它的start方法,它會調用run方法,記住不是直接調用run方法。

      產生線程後,接下來是線程的控制和通訊了。

      在講這個之前先講一下線程的狀態。線程有5個狀態:開始、就緒、運行、阻塞、結束。當一個線程開始之後處於就緒狀態,此時的線程是可啟動並執行,只要CPU給它分配了時間它就可以運行;一個線程獲得了CPU時間後就開始運行,此時是處於運行狀態,直到運行結束後轉到結束狀態,或者因為自己休眠讓出CPU時間、等待其他線程的結果、等待IO操作等而轉到阻塞狀態;處於阻塞狀態的線程必須在其被喚醒之後才能轉到就緒狀態等待分配CPU時間。關於這些內容的深入可以參考一下作業系統這部分的知識。

      可以使用Thread類的sleep(long mills)讓該線程休眠,使用yield讓該線程讓出CPU時間給其他線程使用,使用thread2.join()方法讓調用該方法的線程處於阻塞狀態,等待thread2線程直到它運行完後才處於就緒狀態。關於通訊的方法還有wait、notify、notifyAll等,wait不用等到線程結束才可以喚醒,只要被等待的線程滿足某個條件後調用notify或notifyAll就可以喚醒等待它的某個線程或所有線程。結合以上各種方法可以實現線程間的通訊協作。

      因為資源有限,如果多個線程使用同樣的資源,可能產生衝突,即所謂的競爭。此時需要進行同步,即對資源進行加鎖。可以使用synchronized關鍵字對要使用的資源進行同步,有兩種使用方法:一個是對資源使用的臨界區,即對資源的操作用一個方法實現,將該方法申明為synchronize;一個是用synchronize(expr){},expr必須可以求出對象的引用,一般是要使用的資源,對資源的操作在{}的程式碼片段裡面。

      好了,既然線程可以對資源進行加鎖,那麼就可能存在死結的情況。比如線程1先鎖了資源A,線程2先鎖了資源B,然後線程1接著鎖資源B,線程2接著鎖資源A。因為線程2已經鎖了資源B,所以線程1得等線程2釋放資源B才能運行,同樣線程2得等線程1釋放資源A才能運行,這樣就形成了1等2,2又等1的情況,即死結。

      解決死結的方法是用資源排序的技術,即給每一個需要鎖定的對象定義一個順序,確保每個線程都按這個順序來鎖定對象。對上面的例子,假設按資源A、資源B的順序排序這兩個對象,採用這種技術,那麼線程2必須先鎖定資源A,然後才能鎖定資源B。一旦線程1鎖定了資源A,線程2隻能等待對資源A的加鎖,所以線程1就能鎖定資源B,不會發生死結現象。

      關於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.