



下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
線原理分析&鎖的深度線什么是都可以使用線。在開發(fā)過程中,合理地使用線能夠帶來3個(gè)好處。線作線的分Java資源的,因?yàn)閖ava提供了線。在jdk1.5以前的版本中,線的使用是及其簡陋的,但是在JDK1.5后,有了很大的改善。JDK1.5java.util.concurrent,java.util.concurrentExecutor(JDK1.52004),但是很多程序員對(duì)于其中的一些原理ExecutorThreadPoolExecutor類,ExecutorsnewScheduledThreadPool、newFixedThreadPool、newCachedThreadPool方法其實(shí)也只是ThreadPoolExecutor下的線那么它的底層原理是怎樣實(shí)現(xiàn)的呢這篇就來介紹下ThreadPoolExecutor線的運(yùn)行過程corePoolSize:池的大小。當(dāng)有任務(wù)來之后,就會(huì)創(chuàng)建一個(gè)線程去執(zhí)行任務(wù),當(dāng)線中的線程數(shù)corePoolSizeumPoolSize:線最大線程數(shù),它表示中最多能創(chuàng)建多少個(gè)線程keepAliveTime:unit:keepAliveTime7TimeUnit7線四種創(chuàng)建方Java通過Executors(jdk1.5并發(fā)包)提供四種線,分別為newFixedThreadPool創(chuàng)建一個(gè)定長線,可控制線程最大并發(fā)數(shù),超出的線程會(huì)在隊(duì)列中等待。newScheduledThreadPool創(chuàng)建一個(gè)定長線,支持定時(shí)及周期性任務(wù)執(zhí)行。newSingleThreadExecutor創(chuàng)建一個(gè)單線程化的線,它只會(huì)用唯一的工作線程來執(zhí)行任務(wù),保證所有任務(wù)按照指定順序(FIFO,LIFO,優(yōu)先級(jí))執(zhí)行。創(chuàng)建一個(gè)可緩存線,如果線長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。示例代碼如下////無限大小 jvm自動(dòng)回ExecutorServicenewCachedThreadPool=Executors.newCachedThreadPool();for(inti=0;i<10;i++){finalinttemp=i;newCachedThreadPool.execute(newRunnable(){publicvoidrun(){try{}catch(Exceptione)//TODO:handle}System.out.println(Thread.currentThread().getName()+",i:"+}}}總結(jié):線為無限大,當(dāng)執(zhí)行第二個(gè)任務(wù)時(shí)第一個(gè)任務(wù)已經(jīng)完成,會(huì)復(fù)用執(zhí)行第一個(gè)任務(wù)的線程,而不創(chuàng)建一個(gè)定長線,可控制線程最大并發(fā)數(shù),超出的線程會(huì)在隊(duì)列中等待。示例代碼如下ExecutorServiceExecutorServicenewFixedThreadPool=Executors.newFixedThreadPool(5);for(inti=0;i<10;i++){finalinttemp=i;newFixedThreadPool.execute(newRunnable(){publicvoidrun()System.out.println(Thread.currentThread().getId()+",i:"+}}總結(jié):因?yàn)榫€大小為3,每個(gè)任務(wù)輸出index后sleep2秒,所以每兩秒打印3個(gè)數(shù)字定長線的大小最好根據(jù)系統(tǒng)資源進(jìn)行設(shè)置。如創(chuàng)建一個(gè)定長線,支持定時(shí)及周期性任務(wù)執(zhí)行。延遲執(zhí)行示例代碼如下ScheduledExecutorServiceScheduledExecutorServicenewScheduledThreadPool=Executors.newScheduledThreadPool(5);for(inti=0;i<10;i++){finalinttemp=i;newScheduledThreadPool.schedule(newRunnable(){publicvoidrun()System.out.println("i:"+}},3,}表示延遲3秒執(zhí)創(chuàng)建一個(gè)單線程化的線,它只會(huì)用唯一的工作線程來執(zhí)行任務(wù),保證所有任務(wù)按照指定順序(FIFO,LIFO,優(yōu)先級(jí))執(zhí)行。示例代碼如下ExecutorServiceExecutorServicenewSingleThreadExecutor=Executors.newSingleThreadExecutor();for(inti=0;i<10;i++){finalintindex=i;newSingleThreadExecutor.execute(newRunnable(){publicvoidrun(){System.out.println("index:"+index);try{}catch(Exceptione)//TODO:handle}}}注意:結(jié)果依次輸出,相當(dāng)于順序執(zhí)行各個(gè)任務(wù)線原理剖提交一個(gè)任務(wù)到線中,線的處理流程如下2、線判斷工作隊(duì)列是否已滿,如果工作隊(duì)列沒有滿,則將新提交的任務(wù)在這個(gè)工作隊(duì)列里。如合理配置任務(wù)的性質(zhì):CPU,IO置Ncpu+1個(gè)線程的線。IO密集型任務(wù)則由于需要等待IO操作,線程并不是一直在執(zhí)行任務(wù),則配2*NcpuCPUIORuntime.getRuntime().availableProcessors()CPU執(zhí)行,需要注意的是如果一直有優(yōu)先級(jí)高的任務(wù)提交到隊(duì)列里,那么優(yōu)先級(jí)低的任務(wù)可能不能執(zhí)行CPU。I/O前者稱為計(jì)算密集型(CPU)computer-bound,I/O,I/O-boundJava鎖的深度悲觀鎖、樂觀鎖、排他場悲觀鎖與樂觀block直到它拿到鎖。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫里邊就用到了很多這種鎖機(jī)Select*fromxxxfor重入JAVAsynchronized和publicclassTestimplementspublicclassTestimplementsRunnablepublicsynchronizedvoidget()System.out.println("name:"+Thread.currentThread().getName()+"get();");}publicsynchronizedvoidset()System.out.println("name:"+Thread.currentThread().getName()+"}publicvoidrun(){}publicpublicstaticvoidmain(String[]args){Testss=newTest();newThread(ss).start();newThread(ss).start();newThread(ss).start();newThread(ss).start();}}publicclassTest02extendsThread{ReentrantLockpublicclassTest02extendsThread{ReentrantLocklock=newReentrantLock();publicvoidget(){}publicvoidset(){}publicvoidrun(){}publicstaticvoidmain(String[]args){Testss=newTest();newThread(ss).start();newThread(ss).start();new}}讀寫Java(LocksinJava)Lock任何問題,所以應(yīng)該允許多個(gè)線程能在同時(shí)共享資源。但是如果有一個(gè)線程想去寫這些共享資源,不能共存)。這就需要一個(gè)讀/寫鎖來解決這個(gè)問題。Java5java.util.concurrentpublicpublicclassCachestaticMap<String,Object>map=newHashMap<String,Object>();staticReentrantReadWriockrwl=newReentrantReadWriock();staticLockr=rwl.readLock();staticLockw=rwl.wri//獲取一個(gè)key對(duì)應(yīng)的publicstaticfinalObjectget(Stringkey)try{System.out.println("正在做讀的操作,keykey開始Objectobject=System.out.println("正在做讀的操作,keykey結(jié)束");return}catch(InterruptedExceptione)}finally}return}//設(shè)置key對(duì)應(yīng)的value,并返回舊有的publicstaticfinalObjectput(Stringkey,Objectvalue)try{System.out.println("正在做寫的操作,keykey",valuevalue開始.");Objectobject=map.put(key,System.out.println("正在做寫的操作,keykey",valuevalue結(jié)束.");return}catch(InterruptedExceptione)}finally}return}}publicstaticfinalvoidclear()try{}finally}}publicstaticvoidmain(String[]args){newThread(newRunnable(){publicvoidrun()for(inti=0;i<10;i++){Cache.put(i+"",i+"");}}newThread(newRunnable()publicvoidrun()for(inti=0;i<10;i++){Cache.get(i+"");}}}}CAS無鎖機(jī)與鎖相比,使用比較交換(CAS)會(huì)使程序看起來更加復(fù)雜一些。但由于其非阻塞性,它就憑借這兩個(gè)優(yōu)勢(shì),就值得我們嘗試使用無鎖的并發(fā)CAS算法的過程是這樣:它包含三個(gè)參數(shù)CAS(V,E,N):V表示要更新的變量,E表示預(yù)期值,N表示V等于E會(huì)將V設(shè)為N,如果V值和E說明已經(jīng)有其他線程做了更新,則當(dāng)前線程什么都不做。最后,CAS當(dāng)前VCAS操作是抱觀的態(tài)度進(jìn)行的,它總是認(rèn)為自己可以成功完成操作。當(dāng)多個(gè)線程同時(shí)使用CAS敗,并且允許再次嘗試,當(dāng)然也允許失敗的線程放棄操作?;谶@樣的原理,CASCASJDK5.0Atomicallyincrementsbyonethecurrent*@returntheupdatedpublicfinalintincrementAndGet(){for(;;){//intcurrent=//intnext=current+ if(compareAndSet(current,next))returnnext;}}自旋privateAtomicReference<Thread>privateAtomicReference<Thread>sign=newpublicvoidlock()Threadcurrent=whilepareAndSet(null,current))}}publicvoidunlock()Threadcurrent=Thread.currentThread();pareAndSet(current,null);}publicpublicclassTestimplementsRunnable{staticintsum;privateSpinLockpublicTest(SpinLocklock){this.lock=lock;}@param@throwspublicstaticvoidmain(String[]args)throwsInterruptedException{SpinLocklock=newSpinLock();for(i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 長沙商貿(mào)旅游職業(yè)技術(shù)學(xué)院《擊劍俱樂部》2024-2025學(xué)年第一學(xué)期期末試卷
- 嘉興南湖學(xué)院《數(shù)值計(jì)算與最優(yōu)化方法》2024-2025學(xué)年第一學(xué)期期末試卷
- 對(duì)外經(jīng)濟(jì)貿(mào)易大學(xué)《國際金融理論與實(shí)務(wù)》2024-2025學(xué)年第一學(xué)期期末試卷
- 邯鄲應(yīng)用技術(shù)職業(yè)學(xué)院《水工鋼筋混凝土結(jié)構(gòu)》2024-2025學(xué)年第一學(xué)期期末試卷
- 漢江師范學(xué)院《行草創(chuàng)作(3)》2024-2025學(xué)年第一學(xué)期期末試卷
- 河南農(nóng)業(yè)大學(xué)《3dsMAX計(jì)算機(jī)輔助設(shè)計(jì)》2024-2025學(xué)年第一學(xué)期期末試卷
- 鄭州職業(yè)技術(shù)學(xué)院《社會(huì)調(diào)查理論與方法》2024-2025學(xué)年第一學(xué)期期末試卷
- 哈爾濱電力職業(yè)技術(shù)學(xué)院《化工工藝學(xué)》2024-2025學(xué)年第一學(xué)期期末試卷
- 鄂爾多斯應(yīng)用技術(shù)學(xué)院《結(jié)構(gòu)可靠度理論及其應(yīng)用》2024-2025學(xué)年第一學(xué)期期末試卷
- 學(xué)生自我急救知識(shí)培訓(xùn)課件
- 動(dòng)物的行為發(fā)育與行為遺傳
- 風(fēng)光儲(chǔ)儲(chǔ)能項(xiàng)目PCS艙、電池艙吊裝方案
- 原發(fā)性骨質(zhì)疏松癥診療指南(2022版)第一部分
- 重慶醫(yī)科大學(xué)附屬第一醫(yī)院改建PET-CT、PET-MR項(xiàng)目環(huán)評(píng)報(bào)告
- 2022水電站計(jì)算機(jī)監(jiān)控系統(tǒng)上位機(jī)現(xiàn)場驗(yàn)收標(biāo)準(zhǔn)手冊(cè)
- 政務(wù)服務(wù)大廳管理規(guī)范:安全與應(yīng)急處置
- 雙重預(yù)防機(jī)制構(gòu)建-隱患排查治理(中石化中原油田天然氣廠)
- 五牌一圖(完整版)
- 二年級(jí)下冊(cè)音樂《每天》教案
- 音樂美學(xué).課件
- 心肺復(fù)蘇說課比賽課件模板(一等獎(jiǎng))
評(píng)論
0/150
提交評(píng)論