說到j(luò)ava的話達(dá)內(nèi)科技的小編相信大家肯定是不陌生的了,對于java來說從問世以來一直在開發(fā)界有著很高的地位的。很多的產(chǎn)品在開發(fā)語言的選擇上也肯定是java
的,所以說大家對于java語言的熟悉度就很高的了,那么什么是java的并發(fā)編程呢?
1、線程基礎(chǔ)概念
線程是指在一個(gè)單獨(dú)進(jìn)程中,對于CPU和內(nèi)存而言的多個(gè)工作單位,所有線程在進(jìn)程中的資源都是共享的,包括全局?jǐn)?shù)據(jù)、執(zhí)行代碼等。
cpu核心數(shù)與線程數(shù)
核心數(shù) : 線程數(shù) = 1 : 1
如一個(gè)8核的cpu,該cpu會(huì)至少支持8個(gè)線程同時(shí)運(yùn)行
intel引入了超線程技術(shù)后:
核心數(shù) : 線程數(shù) = 1 : 2
在編碼過程中可以感覺到同時(shí)運(yùn)行的線程遠(yuǎn)遠(yuǎn)不止這些。由于cpu的時(shí)間片輪轉(zhuǎn)機(jī)制又稱RR調(diào)度,簡單點(diǎn)講,操作系統(tǒng)會(huì)把已就緒的線程排成一個(gè)隊(duì)列,給每個(gè)進(jìn)程一個(gè)時(shí)間分片,該線程在cpu中執(zhí)行完這個(gè)時(shí)間分片后,不論是否執(zhí)行完都會(huì)讓出cpu資源給另外的線程,這樣在某一時(shí)間段內(nèi)就好像有很多線程在同時(shí)運(yùn)行。
操作系統(tǒng)和cpu在進(jìn)行時(shí)間分片的任務(wù)切換時(shí)也是需要時(shí)間的,而且往往占用的時(shí)間比例又很大,所以在多線程開發(fā)時(shí)關(guān)注上下文切換對于多線程執(zhí)行時(shí)間和性能的影響。
二、進(jìn)程和線程區(qū)別
進(jìn)程:程序運(yùn)行進(jìn)行資源分配的小單位,進(jìn)程中有多個(gè)線程,會(huì)共享這個(gè)線程的資源
線程:cpu調(diào)度的小單位,必須依賴進(jìn)程而存在
例子:啟動(dòng)的一個(gè)jar包程序就是一個(gè)進(jìn)程,而可以通過啟動(dòng)參數(shù)配置它的內(nèi)存大小,-xmx,-xms等。而每一個(gè)請求都是在線程上去進(jìn)行的,cpu通過執(zhí)行線程任務(wù)完成每個(gè)請求任務(wù)。
三、并行和并發(fā)
并行:同一時(shí)刻,可以同時(shí)處理事情的能力
并發(fā):與單位時(shí)間有關(guān),在單位時(shí)間內(nèi)可以處理問題的能力
舉個(gè)例子,假設(shè)不考慮超線程技術(shù),一個(gè)4核cpu在任何一個(gè)時(shí)刻處理的是4個(gè)線程,并行數(shù)為4,而由于時(shí)間片輪轉(zhuǎn)機(jī)制,它在1秒內(nèi)可以支持處理100個(gè)線程,它在1秒內(nèi)的并發(fā)數(shù)為100
四、高并發(fā)編程優(yōu)勢
充分利用cpu的資源。如果是單線程,只占用一個(gè)核,其它的空閑;加快響應(yīng)時(shí)間。合理的設(shè)計(jì)多線程程序,使請求處理加快;程序模塊化異步化
線程共享資源,會(huì)存在沖突、會(huì)存在死鎖、啟動(dòng)線程太多,濫用線程,壓垮服務(wù)器。線程方法,java線程是協(xié)作式的,而不是搶占式
五、線程終止的方法interrupt()
線程之前提供了stop(),resume(),suspend()方法來終止線程,但已不建議使用,stop()會(huì)導(dǎo)致線程不會(huì)正確的釋放資源,suspend()會(huì)導(dǎo)致死鎖。
要通過interrupt(),isInterrupted(),static interrupted()來自己實(shí)現(xiàn)中斷線程
interrupt() :調(diào)用一個(gè)線程的interrupt()
方法中斷一個(gè)線程,并不是強(qiáng)行關(guān)閉這個(gè)線程,只是跟這個(gè)線程打個(gè)招呼,將線程的中斷標(biāo)志位置為true,線程是否中斷,由線程本身決定。
isInterrupted(): 判定當(dāng)前線程是否處于中斷狀態(tài)。
static interrupted() :判定當(dāng)前線程是否處于中斷狀態(tài),同時(shí)中斷標(biāo)志位改為false。
thead.setPriority()方法
優(yōu)先級的范圍1~100,缺省為5,但線程的優(yōu)先級不可靠,不建議作為線程開發(fā)時(shí)候的手段。
java線程是映射到系統(tǒng)的原生線程來實(shí)現(xiàn)的,所以線程的調(diào)度終決定于操作系統(tǒng)。雖然現(xiàn)在很多操作系統(tǒng)提供了線程優(yōu)先級的概念,但是不見得會(huì)與java線程的優(yōu)先級一一對應(yīng),如果優(yōu)先級比java線程多還好說,要是少的話,就不得不出現(xiàn)幾個(gè)優(yōu)先級相同的情況了。
Java的并發(fā)編程是比較復(fù)雜的,在學(xué)習(xí)的過程中可能會(huì)出現(xiàn)錯(cuò)亂,但是如果說你有一個(gè)專業(yè)的講師來指導(dǎo)的話肯定是沒有問題的。達(dá)內(nèi)科技?xì)g迎每位想要學(xué)習(xí)java語言的學(xué)員來我們公司的java培訓(xùn)班進(jìn)行實(shí)地考察,也可以點(diǎn)擊我們文章下面的獲取試聽資格按鈕來獲取我們的java課程免費(fèi)試聽資格,在試聽中可以更加深入的了解我們達(dá)內(nèi)科技。