java基礎(chǔ)視頻23.多線程上_第1頁(yè)
java基礎(chǔ)視頻23.多線程上_第2頁(yè)
java基礎(chǔ)視頻23.多線程上_第3頁(yè)
java基礎(chǔ)視頻23.多線程上_第4頁(yè)
java基礎(chǔ)視頻23.多線程上_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第五小階段多線程GUI網(wǎng)絡(luò)編程反射及新特性Day23多線程(上)菜單線程的基本概念線程的創(chuàng)建和啟動(dòng)線程的實(shí)現(xiàn)方式線程的安全問(wèn)題同步鎖其他擴(kuò)充內(nèi)容進(jìn)程(process)什么是進(jìn)程?Ctrl+Shift+Esc 打開(kāi)windows任務(wù)管理器進(jìn)程是操作系統(tǒng)動(dòng)態(tài)執(zhí)行和資源分配的一個(gè)基本單元,就是程序執(zhí)行的過(guò)程,在這個(gè)過(guò)程中會(huì)占用內(nèi)存空間和CPU資源。在操作系統(tǒng)中,程序的體現(xiàn)就是進(jìn)程。一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)復(fù)雜的應(yīng)用程序可能啟動(dòng)并使用多個(gè)進(jìn)程,例如谷歌Chrome瀏覽器、騰訊的QQ等采用的就是多進(jìn)程架構(gòu)設(shè)計(jì)。進(jìn)程間相互獨(dú)立,不能互相訪問(wèn)或共享資源相關(guān)性,看你CPU的核心有幾個(gè)(雙核處理器、四核處理

2、器、八核處理器)看一下自己的電腦中的進(jìn)程及相關(guān)性吧線程(thread)線程是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位,它是進(jìn)程的一部分一個(gè)進(jìn)程可以擁有多個(gè)線程,但至少要有一個(gè)線程,即主執(zhí)行線程(java的main方法),我們之前寫的都是單線程程序。線程不能夠單獨(dú)執(zhí)行,它必須運(yùn)行在處于活動(dòng)狀態(tài)的進(jìn)程中,它可與同屬一個(gè)進(jìn)程的其他線程共享進(jìn)程所擁有的全部資源生活案例:1. 火車可以擁有多節(jié)車廂,但至少要有一節(jié)車廂,火車就是進(jìn)程,每個(gè) 車廂就是一個(gè)線程2. QQ可以打開(kāi)多個(gè)聊天窗口,QQ就是進(jìn)程,每個(gè)聊天窗口就是一個(gè)線 程多線程編程在一個(gè)程序中能讓兩個(gè)for循環(huán)同時(shí)執(zhí)行嗎?一個(gè)進(jìn)程中的多個(gè)線程可以并發(fā)(同時(shí))

3、執(zhí)行,因此用多線程編程即可解決這個(gè)問(wèn)題。有必要搞多個(gè)線程嗎?有什么用?多線程編程能解決什么問(wèn)題?在一些執(zhí)行時(shí)間長(zhǎng)、需要等待的任務(wù)上(文件讀寫和網(wǎng)絡(luò)傳輸?shù)龋?,多線程就比較有用了。例如:多圖片上傳方案1:一張一張來(lái)方案2:多張同時(shí)開(kāi)始(多線程編程)多線程是為了共享內(nèi)存、充分利用CPU,是為了同時(shí)完成多項(xiàng)任務(wù),是為了提高資源(內(nèi)存和CPU)使用率從而提高程序的執(zhí)行效率。CPU與多線程一心無(wú)二用,一個(gè)人能同時(shí)干多件事情嗎?(邊看片兒邊寫字)那計(jì)算機(jī)是怎么實(shí)現(xiàn)的呢?真正的“同時(shí)”幾乎是不存在的,CPU在以極快的速度隨機(jī)輪流執(zhí)行程序,專業(yè)說(shuō)法是程序在快速輪流搶占CPU資源。速度太快,人感覺(jué)不到。一個(gè)(程序

4、)進(jìn)程中如果只有一條生產(chǎn)線,這個(gè)程序稱為單線程。一個(gè)(程序)進(jìn)程中如果有多條生產(chǎn)線,這個(gè)程序稱為多線程。class Demo extends Thread /生產(chǎn)線 (線程類)public void run()for(int x=30; x50; x+) System.out.println(Thread-+x);class ThreadDemo public static void main(String args) /主線程(必須有的)Demo d1 = new Demo(); /創(chuàng)建一個(gè)生產(chǎn)線(線程)d1.start(); /啟動(dòng)線程for(int x=0; x30; x+) Syste

5、m.out.println(main-+x);多執(zhí)行幾次觀察結(jié)果膠片電影用Java實(shí)現(xiàn)多線程C+這種語(yǔ)言傳統(tǒng)上一直是性能之王。但是,C+對(duì)多線程技術(shù)的支持非常有限。標(biāo)準(zhǔn)C+甚至沒(méi)有提到線程這個(gè)概念。要想使用C+開(kāi)發(fā)多線程程序是非常困難的。Java從一開(kāi)始就在語(yǔ)言層面上支持多線程。使用Java編寫多線程的程序是非常簡(jiǎn)單的。因此,基本上所有的Java程序,包括J2ME、J2SE、J2EE程序都支持多線程技術(shù)。在傳統(tǒng)單核、單進(jìn)程CPU上,Java多線程程序在性能上無(wú)法與C+單進(jìn)程程序相比。但是,隨著多核、超線程CPU時(shí)代的到來(lái),將成就Java性能之王的地位!Java中有兩類線程:User Threa

6、d(用戶線程)、Daemon Thread(守護(hù)線程或后臺(tái)服務(wù)線程) 。守護(hù)線程的作用是為其他線程的運(yùn)行提供服務(wù),比如說(shuō)GC線程。在Java中實(shí)現(xiàn)多線程有兩種方式:方式一. 繼承Thread類方式二. 實(shí)現(xiàn)Runnable接口方式一java.lang.Thread是Java提供的線程類,我們通??梢越柚谒鼇?lái)實(shí)現(xiàn)多線程編程。實(shí)現(xiàn)步驟:自定義線程類即生產(chǎn)線(繼承Thread類)重寫Thread類中的run()方法,把希望能同時(shí)運(yùn)行的代碼放在run()方法中。創(chuàng)建生產(chǎn)線,即創(chuàng)建線程類的對(duì)象并調(diào)用start()方法啟動(dòng)生產(chǎn)線該類常用方法:public long getId(),獲得該線程的標(biāo)識(shí)符(線

7、程 ID) ,它在創(chuàng)建該線程時(shí)生成。線程 ID 是唯一的,并終生不變。public final void setName(String name),給線程命名,不命名的話都有默認(rèn)的,格式為:Thread-0、Thread-1.public final String getName(),獲得線程的名字public void start(),使該線程開(kāi)始執(zhí)行,JVM會(huì)自動(dòng)調(diào)用該線程的 run() 方法。public static void sleep(long millis),讓線程休眠(暫停)多少毫秒public static Thread currentThread(),獲得當(dāng)前正在執(zhí)行的線程

8、對(duì)象的引用。(方式二會(huì)用到)多線程執(zhí)行流程每個(gè)Java程序都有一個(gè)默認(rèn)的主線程。Java程序總是從主類的main方法開(kāi)始執(zhí)行。當(dāng)JVM加載代碼,發(fā)現(xiàn)main方法后就啟動(dòng)一個(gè)線程,這個(gè)線程就稱作主線程,該線程負(fù)責(zé)執(zhí)行main方法。在main方法中再創(chuàng)建的線程就是其他線程。如果main方法中沒(méi)有創(chuàng)建其他線程,那么當(dāng)main方法執(zhí)行完時(shí)JVM就會(huì)結(jié)束Java應(yīng)用程序。但如果main方法中創(chuàng)建了其他線程,那么JVM就要在主線程和其他線程之間輪流切換,保證每個(gè)線程都有機(jī)會(huì)使用CPU資源,即使main方法結(jié)束(主線程結(jié)束)JVM也不會(huì)結(jié)束,要一直等到該程序所有線程全部結(jié)束才結(jié)束Java程序注意CPU的隨機(jī)

9、性,主線程不一定先執(zhí)行,“主”的意思是它是必須存在的課堂案例用方式一實(shí)現(xiàn)兩個(gè)學(xué)生同時(shí)看書(10頁(yè)/100ms)需要同時(shí)執(zhí)行的功能是什么誰(shuí)是線程類(生產(chǎn)線)需要?jiǎng)?chuàng)建幾條生產(chǎn)線并啟動(dòng)方式二java.lang.Runnable接口是Java提供的實(shí)現(xiàn)多線程編程的另一種方式,該接口只定義了一個(gè)無(wú)參的run方法。具體實(shí)現(xiàn)步驟:創(chuàng)建假線程類即假生產(chǎn)線,覆蓋Runnable接口中的run方法,把希望能同時(shí)運(yùn)行的代碼放在run()方法中。創(chuàng)建生產(chǎn)線,即通過(guò)Thread類創(chuàng)建一個(gè)線程(構(gòu)造方法需要一個(gè)線程類對(duì)象)。啟動(dòng)生產(chǎn)線,即調(diào)用Thread類對(duì)象的start方法開(kāi)啟線程。class Shengchanxia

10、n implements Runnable /創(chuàng)建線程類(不是真正的生產(chǎn)線)public void run()for(int j=0; j30; j+) System.out.println(Thread.currentThread().getName()+-+j);class Demopublic static void main(String args) /主線程Shengchanxian scx=new Shengchanxian();Thread t1=new Thread(scx); /創(chuàng)建第一個(gè)生產(chǎn)線t1.start(); /啟動(dòng)Thread t2=new Thread(scx);

11、 /創(chuàng)建第二個(gè)生產(chǎn)線t2.start(); /啟動(dòng)課堂案例用方式二實(shí)現(xiàn)兩個(gè)學(xué)生同時(shí)看書(10頁(yè)/100ms)需要同時(shí)執(zhí)行的功能是什么誰(shuí)是線程類(不是真正的生產(chǎn)線)創(chuàng)建幾條生產(chǎn)線(Thread類)并啟動(dòng)小結(jié)兩種實(shí)現(xiàn)方式的對(duì)比: 1.由于Java只支持單一繼承,所以方式一的弊端顯而易見(jiàn)2.但是方式一更簡(jiǎn)單易懂,方式二有點(diǎn)復(fù)雜線程安全問(wèn)題1線程安全問(wèn)題2public class SaleWindow implements Runnable private int ticket = 10; / 車票編號(hào),共享資源 public void run() for (int i = 1; i = 1) Sys

12、tem.out.println(Thread.currentThread().getName() + 賣編號(hào)+ ticket + 票); ticket - -; Thread.sleep(500); / 模擬賣票速度,半秒一張 public static void main(String args) SaleWindow sw = new SaleWindow();new Thread(sw).start(); / 窗口1new Thread(sw).start(); / 窗口2 多執(zhí)行幾次觀察結(jié)果模擬實(shí)現(xiàn):除夕那天北京到鄭州的動(dòng)車票只剩下10張,兩個(gè)窗口同時(shí)在賣解決線程安全問(wèn)題出現(xiàn)線程安全問(wèn)

13、題的主要原因是:線程之間是獨(dú)立的,多個(gè)線程之間共享的數(shù)據(jù)不同步判斷多線程程序是否存在安全隱患:1. 代碼中存在共享數(shù)據(jù)2. 多個(gè)線程可能同時(shí)操作共享數(shù)據(jù)解決線程安全問(wèn)題的辦法:java中提供了一個(gè)同步機(jī)制(鎖)。即讓操作共享數(shù)據(jù)的代碼在某一時(shí)間段,只被一個(gè)線程執(zhí)行(鎖住),在執(zhí)行過(guò)程中,其他線程不可以參與進(jìn)來(lái),這樣共享數(shù)據(jù)就能同步了。簡(jiǎn)單來(lái)說(shuō),就是給代碼加把鎖。Java同步機(jī)制的實(shí)現(xiàn)方式:同步代碼塊同步方法(函數(shù))同步代碼塊鎖從哪兒來(lái)?Java中的每個(gè)對(duì)象都內(nèi)置了一個(gè)鎖(監(jiān)視器monitor),當(dāng)某個(gè)線程執(zhí)行到同步代碼塊時(shí)就會(huì)自動(dòng)得到這個(gè)對(duì)象的鎖,那么其他線程就無(wú)法執(zhí)行同步代碼塊了,一直要等到

14、之前那個(gè)線程停止(釋放鎖)。語(yǔ)法格式:synchronized(對(duì)象) /可以使用任意對(duì)象的鎖,包括this操作共享數(shù)據(jù)的代碼即需要同步的代碼;/使用當(dāng)前售票窗口對(duì)象的鎖來(lái)鎖住賣票的代碼synchronized(this) /當(dāng)前售票窗口/賣票的代碼/使用任意對(duì)象的鎖來(lái)鎖住賣票的代碼Object obj=new Object();synchronized(obj) /當(dāng)前售票窗口/賣票的代碼同步方法(函數(shù))代碼塊是用于封裝代碼的,而我們之前學(xué)習(xí)的方法(函數(shù))也是可以封裝代碼的,剛才我們同步了一個(gè)代碼塊,那么能否同步一個(gè)方法(函數(shù))呢?課堂案例:賣火車票改為同步方法實(shí)現(xiàn)一個(gè)類中既可以有同步方法也

15、可以有普通方法語(yǔ)法格式:public synchronized void sell() /鎖是固定的this,即當(dāng)前對(duì)象操作共享數(shù)據(jù)的代碼即需要同步的代碼;同步機(jī)制的優(yōu)劣同步的好處: 同步的出現(xiàn)解決了多線程的安全問(wèn)題。同步的弊端:當(dāng)線程相當(dāng)多時(shí),因?yàn)槊總€(gè)線程都會(huì)去判斷同步上的鎖,這是很耗費(fèi)資源的,無(wú)形中會(huì)降低程序的運(yùn)行效率。(性能和線程安全不可兼得)同步靜態(tài)方法(了解即可)靜態(tài)方法(函數(shù))也可以同步,用法和普通方法一樣,只是需要注意:靜態(tài)方法的鎖肯定不是this,為什么?靜態(tài)方法隨著類的加載而加載,這時(shí)有可能還沒(méi)有該類的對(duì)象,但是一個(gè)類加載進(jìn)內(nèi)存,會(huì)先將這個(gè)類的字節(jié)碼文件封裝成對(duì)象,該對(duì)象的表示方式:類名.class,這是靜態(tài)方法的鎖。小結(jié)同步方法(函數(shù))和同步代碼塊的區(qū)別:1. 語(yǔ)法不同2. 同步代碼塊使用的鎖可以是任意對(duì)象3. 同步方法(函數(shù))使用的鎖是固定對(duì)象this注意細(xì)節(jié):必須有共享資源必須使用同一把鎖只把必

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論