




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
JAVA多線程JAVA多線程主題知識講座第1頁線程的基本概念
線程的創(chuàng)建和啟動
線程的調度和優(yōu)先級線程的狀態(tài)控制
線程同步JAVASE基礎JAVA多線程主題知識講座第2頁線程基本概念線程是一個程序內部次序控制流。線程和進程區(qū)分每個進程都有獨立代碼和數據空間(進程上下文),進程間切換會有較大開銷。線程能夠看成時輕量級進程,同一類線程共享代碼和數據空間,每個線程有獨立運行棧和程序計數器(PC),線程切換開銷小。多進程:在操作系統(tǒng)中能同時運行多個任務(程序)多線程:在同一應用程序中有多個次序流同時執(zhí)行Java線程是經過java.lang.Thread類來實現。
VM開啟時會有一個由主方法(publicstaticvoidmain(){})所定義線程。能夠經過創(chuàng)建Thread實例來創(chuàng)建新線程。每個線程都是經過某個特定Thread對象所對應方法run()來完成其操作,方法run()稱為線程體。經過調用Thead類start()方法來開啟一個線程。JAVA多線程主題知識講座第3頁線程創(chuàng)建和開啟可以有兩種方式創(chuàng)建新線程。第一種定義線程類實現Runnable接口ThreadmyThread=newThead(target)//target為Runnable接口類型。Runnable中只有一個方法:publicvoidrun();用以定義線程運行體。使用Runnable接口可認為多個線程提供共享數據。在實現Runnable接口類run方法定義中可以使用Thread靜態(tài)方法:publicstaticThreadcurrentThread()獲取當前線程引用。第二種可以定義一個Thread子類并重寫其run方法如:classMyThreadextendsThead{publicvoidrun(){…}}然后生成該類對象: MyThreadmyThread=newMyThead(…)使用那種好呢?JAVA多線程主題知識講座第4頁線程狀態(tài)轉換JAVA多線程主題知識講座第5頁方法功能isAlive()判斷線程是否還“活”著,即線程是否還未終止。getPriority()取得線程優(yōu)先級數值setPriority()設置線程優(yōu)先級數值Thread.sleep()將當前線程睡眠指定毫秒數join()調用某線程該方法,將當前線程與該線程“合并”,即等候該線程結束,再恢復當前線程運行。yield()讓出CPU,當前線程進入就緒隊列等候調度。wait()當前線程進入對象waitpool。notify()/notifyAll()喚醒對象waitpool中一個/全部等候線程。線程狀態(tài)轉換JAVA多線程主題知識講座第6頁sleep/join/yield方法sleep方法能夠調用Thread靜態(tài)方法:
publicstaticvoidsleep(longmillis)throwsInterruptedException
使得當前線程休眠(暫時停頓執(zhí)行millis毫秒)。因為是靜態(tài)方法,sleep能夠由類名直接調用:
Thread.sleep(…)join方法合并某個線程yield方法讓出CPU,給其它線程執(zhí)行機會JAVA多線程主題知識講座第7頁線程模式兩種線程模式:協(xié)作式:一個線程保留對處理器控制直到它自己決定放棄速度快、代價低用戶編程非常麻煩搶先式。系統(tǒng)能夠任意從線程中奪回對CPU控制權,再把控制權分給其它線程。兩次切換之間時間間隔就叫做時間片
效率不如協(xié)作式高,OS關鍵必須負責管理線程簡化編程,而且使程序愈加可靠多數線程調度是搶先式。JAVA多線程主題知識講座第8頁線程優(yōu)先級別Java提供一個線程調度器來監(jiān)控程序中開啟后進入就緒狀態(tài)全部線程。線程調度器按照線程優(yōu)先級決定應調度哪個線程來執(zhí)行。線程優(yōu)先級用數字表示,范圍從1到10,一個線程缺省優(yōu)先級是5。
Thread.MIN_PRIORITY=1 Thread.MAX_PRIORITY=10 Thread.NORM_PRIORITY=5
使用下述線方法取得或設置線程對象優(yōu)先級。
intgetPriority(); voidsetPriority(intnewPriority);不一樣平臺上優(yōu)先級Solaris:相同優(yōu)先級線程不能相互搶占對方cpu時間。windows:能夠搶占相同甚至更高優(yōu)先級線程cpu時間JAVA多線程主題知識講座第9頁臨界資源問題(1)兩個線程A和B在同時操縱Stack類同一個實例(堆棧),A正在往堆棧里push一個數據,B則要從堆棧中pop一個數據。classStack{ intidx=0; char[]data=newchar[6]; publicvoidpush(charc){ data[idx]=c; idx++; } publiccharpop(){ idx--; returndata[idx]; }}JAVA多線程主題知識講座第10頁臨界資源問題(2)1. 操作之前data=|a|b|||||idx=22. A執(zhí)行push中第一個語句,將c推入堆棧;
data=|a|b|c||||idx=23. A還未執(zhí)行idx++語句,A執(zhí)行被B中止,B執(zhí)行pop方法,返回c:
data=|a|b|c||||idx=14. A繼續(xù)執(zhí)行push第二個語句:
data=|a|b|c||||idx=2
最終結果相當于c沒有入棧, 產生這種問題原因在于對共享數據訪問操作不完整性。JAVA多線程主題知識講座第11頁線程同時
publicclassTestimplementsRunnable{Timertimer=newTimer();publicstaticvoidmain(String[]args){Testtest=newTest();Threadt1=newThread(test);Threadt2=newThread(test);t1.setName("t1");t2.setName("t2");t1.start();t2.start();}publicvoidrun(){timer.add(Thread.currentThread().getName());}}classTimer{privatestaticintnum=0;publicvoidadd(Stringname){num++;try{Thread.sleep(1);}catch(InterruptedExceptione){}System.out.println(name+",你是第"+num+"個使用timer線程");}}JAVA多線程主題知識講座第12頁Synchronized總結不論synchronized關鍵字加在方法上還是對象上,它取得鎖都是鎖在了對象上,而不是把一段代碼或函數看成鎖――而且同時方法很可能還會被其它線程對象訪問。每個對象只有一個鎖(lock)與之相關聯(lián)。實現同時是要很大系統(tǒng)開銷作為代價,甚至可能造成死鎖,所以盡可能防止無謂同時控制。搞清楚synchronized鎖定是哪個對象,就能幫助我們設計更安全多線程程序。還有一些技巧能夠讓我們對共享資源同時訪問愈加安全:定義privateinstance變量+它get方法,而不要定義public/protectedinstance變量。假如將變量定義為public,對象在外界能夠繞過同時方法控制而直接取得它,并改動它。假如instance變量是一個對象,如數組或ArrayList什么,那上述方法依然不安全,因為當外界對象經過get方法拿到這個instance對象引用后,又將其指向另一個對象,那么這個private變量也就變了,豈不是很危險。這個時候就需要將get方法也加上synchronized同時,而且,只返回這個private對象clone()――這么,調用端得到就是對象副本引用了。JAVA多線程主題知識講座第13頁線程同時在Java語言中,引入了對象互斥鎖概念,確保共享數據操作完整性。每個對象都對應于一個可稱為“互斥鎖”標識,這個標識確保在任一時刻,只能有一個線程訪問該對象。關鍵字synchronized來與對象互斥鎖聯(lián)絡。當某個對象synchronized修飾時,表明該對象在任一時刻只能由一個線程訪問。………synchronized(this){num++;try{Thread.sleep(1);}catch(InterruptedExceptione){}System.out.println(name+",你是第"+num+"個使用timer線程");}………
synchronized使用方法:
synchronized還能夠放在方法申明中,表示整個方法為同時方法,比如:synchronizedpublicvoidadd(Stringname){…}JAVA多線程主題知識講座第14頁面試:Waitsleep區(qū)分起源不一樣Sleep是Thread提供方法Wait繼承自Object代碼位置不一樣Wait需要寫在Synchronize
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 兒童樂園實施合同范本
- 冷棚維修合同范本
- 商品房樓頂鋼結構施工方案
- 單位食堂人員合同范本
- 2025貴州省建筑安全員-A證考試題庫附答案
- 公司內包合同范本
- 養(yǎng)雞合伙合同范本
- 2025年江西省建筑安全員-A證考試題庫及答案
- 借用資產合同范本
- 體育賽事與體育產業(yè)高質量發(fā)展耦合機制
- 2025屆河南省鄭州市外國語學校高考數學三模試卷含解析
- 《高尿酸血癥腎損害》課件
- 天然氣公司巡視檢查管理細則(3篇)
- 九年級道德與法治下冊 第一單元 我們共同的世界 第二課 構建人類命運共同體 第2框《謀求互利共贏》說課稿 新人教版
- 遼寧省營口市2024-2025學年七年級上學期期中語文試題
- 《畫垂線和平行線》(教案)2023-2024學年數學四年級上冊
- GB/T 44770-2024智能火電廠技術要求
- 經典女士剪發(fā)技術圖解教程
- 2023年護理人員分層培訓、考核計劃表
- 第二章-高壓開關電器
- 腫瘤病人的姑息治療和護理
評論
0/150
提交評論