您好,登錄后才能下訂單哦!
這篇文章主要講解了“怎么理解Java并發編程中的線程”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么理解Java并發編程中的線程”吧!
1、線程基礎概念
線程是指在一個單獨進程中,對于CPU和內存而言的多個工作單位,所有線程在進程中的資源都是共享的,包括全局數據、執行代碼等。
cpu核心數與線程數
核心數 : 線程數 = 1 : 1
如一個8核的cpu,該cpu會至少支持8個線程同時運行
intel引入了超線程技術后:
核心數 : 線程數 = 1 : 2
在編碼過程中可以感覺到同時運行的線程遠遠不止這些。由于cpu的時間片輪轉機制又稱RR調度,簡單點講,操作系統會把已就緒的線程排成一個隊列,給每個進程一個時間分片,該線程在cpu中執行完這個時間分片后,不論是否執行完都會讓出cpu資源給另外的線程,這樣在某一時間段內就好像有很多線程在同時運行。
操作系統和cpu在進行時間分片的任務切換時也是需要時間的,而且往往占用的時間比例又很大,所以在多線程開發時關注上下文切換對于多線程執行時間和性能的影響。
二、進程和線程區別
進程:程序運行進行資源分配的最小單位,進程中有多個線程,會共享這個線程的資源
線程:cpu調度的最小單位,必須依賴進程而存在
例子:啟動的一個jar包程序就是一個進程,而可以通過啟動參數配置它的內存大小,-xmx,-xms等。而每一個請求都是在線程上去進行的,cpu通過執行線程任務完成每個請求任務。
三、并行和并發
并行:同一時刻,可以同時處理事情的能力
并發:與單位時間有關,在單位時間內可以處理問題的能力
舉個例子,假設不考慮超線程技術,一個4核cpu在任何一個時刻處理的是4個線程,并行數為4,而由于時間片輪轉機制,它在1秒內可以支持處理100個線程,它在1秒內的并發數為100
四、高并發編程優勢
充分利用cpu的資源。如果是單線程,只占用一個核,其它的空閑;加快響應時間。合理的設計多線程程序,使請求處理加快;程序模塊化異步化
線程共享資源,會存在沖突、會存在死鎖、啟動線程太多,濫用線程,壓垮服務器。線程方法,java線程是協作式的,而不是搶占式
五、線程終止的方法interrupt()
線程之前提供了stop(),resume(),suspend()方法來終止線程,但已不建議使用,stop()會導致線程不會正確的釋放資源,suspend()會導致死鎖。
要通過interrupt(),isInterrupted(),static interrupted()來自己實現中斷線程
interrupt() :調用一個線程的interrupt() 方法中斷一個線程,并不是強行關閉這個線程,只是跟這個線程打個招呼,將線程的中斷標志位置為true,線程是否中斷,由線程本身決定。
isInterrupted(): 判定當前線程是否處于中斷狀態。
static interrupted() :判定當前線程是否處于中斷狀態,同時中斷標志位改為false。
thead.setPriority()方法
優先級的范圍1~100,缺省為5,但線程的優先級不可靠,不建議作為線程開發時候的手段。
java線程是映射到系統的原生線程來實現的,所以線程的調度最終決定于操作系統。雖然現在很多操作系統提供了線程優先級的概念,但是不見得會與java線程的優先級一一對應,如果優先級比java線程多還好說,要是少的話,就不得不出現幾個優先級相同的情況了。
不能太依賴優先級,優先級可能會被系統自行改變。在widows系統存在著一個“優先級推進器”,它的大致作用就是當前系統發現一個線程執行的特別“勤奮努力”的話,可能就會越過線程優先級給它分配時間。
感謝各位的閱讀,以上就是“怎么理解Java并發編程中的線程”的內容了,經過本文的學習后,相信大家對怎么理解Java并發編程中的線程這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。