天天看點

并發程式設計入門

并發程式設計一直是一個令人困惑的問題,主要的原因在于:使用并發時需要解決的問題會有很多;另外實作并發的方式不止一種,實作方式的選擇也是一大問題。

談到并發,首先稍微介紹下什麼是并發,相信很多人都已經對這個概念比較熟悉,并發程式設計是相對順序程式設計的一種新的模式。它可以一定程度的提高程式的執行速度。主要針對程式的阻塞性,因為程式的阻塞使得程式運作效率降低,而并發在一定程度上解決了程式的阻塞性帶來的運作效率問題。是以也可以說,從性能的角度看,如果沒有任務會阻塞,那麼單處理器上的并發就沒有了意義。

看起來并發也沒有多大的作用噢!平常的程式設計工作并沒有遇到很多的阻塞問題,或者涉及到并發問題。就拿Java語言來說。其實不然,Servlet對于熟悉Java的人來說再熟悉不過,而這個作為Web系統最基礎的一個類天生就具有多線程性,而對并發的熟悉能使得我們充分利用這些處理器。

并發程式設計使得我們可以将程式劃分為多個分離的、獨立運作的任務,通過多線程機制,這些獨立任務中的每一個都将由執行線程來驅動。一個線程就是在程序中的一個單一的順序控制流,是以,單個程序可以擁有多個并發執行的任務,但程式使得每個任務都好像有其自己的CPU一樣。其底層機制是切分CPU時間片,這些通常不需要考慮。[p653]

了解了并發相關的一些概念,接下來學習學習Java中的并發程式設計。

Java中Runnable代表一個任務,要實作線程行為,需要顯式地将這個任務附着到線程(Thread)上,

Runnable是執行工作的獨立任務,他不傳回任何值。如果希望在任務完成時能夠傳回一個值,那麼可以實作Callable接口而不是Runnable接口。

如何使用Callable呢?

首先Callable是一種具有類型參數的泛型,它的類型參數表示的是從方法call()中傳回的值;并且必須使用ExecutorService.submit()方法調用它,示例:

submit()方法會産生Future對象,它用Callable傳回結果的特定類型進行了參數化,可以用isDone()方法來查詢Future是否已經完成。[p659]

線程的優先級,優先級較低的隻是執行的頻率比較低,并不是優先級低的将不會在優先級高的線程前執行(即,優先級不會導緻死鎖)。

在絕大多數時間,線程的優先級都應該以預設優先級運作,試圖操作線程優先級通常是一種錯誤。

讀取線程優先級
修改優先級

給線程排程機制一個暗示:工作已經差不多了,可以讓别的線程使用CPU了。

但是這個暗示沒有任何機制保證它會被采納。當調用這個方法時,隻是在建議具有相同優先級的其他線程可以運作。