黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國(guó)咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁(yè) 學(xué)習(xí)攻略 Java多線程學(xué)習(xí),深入解析

Java多線程學(xué)習(xí),深入解析

更新時(shí)間:2019-07-09 09:15:16 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽3829次

  隨著計(jì)算機(jī)技術(shù)的發(fā)展,編程模型也越來(lái)越復(fù)雜多樣化。但多線程編程模型是目前計(jì)算機(jī)系統(tǒng)架構(gòu)的最終模型,本文將對(duì)Java多線程的學(xué)習(xí),深入解析,希望可以幫助到大家:


  一般來(lái)說(shuō),我們把正在計(jì)算機(jī)中執(zhí)行的程序叫做"進(jìn)程"(Process),而不將其稱為程序(Program)。所謂"線程"(Thread),是"進(jìn)程"中某個(gè)單一順序的控制流。新興的操作系統(tǒng),如Mac,WindowsNT,Windows95等,大多采用多線程的概念,把線程視為基本執(zhí)行單位。線程也是Java中的相當(dāng)重要的組成部分之一。


Java多線程學(xué)習(xí),深入解析.jpg


  甚至最簡(jiǎn)單的Applet也是由多個(gè)線程來(lái)完成的。在Java中,任何一個(gè)Applet的paint()和update()方法都是由AWT(AbstractWindowToolkit)繪圖與事件處理線程調(diào)用的,而Applet主要的里程碑方法——init(),start(),stop()和destory()——是由執(zhí)行該Applet的應(yīng)用調(diào)用的。


  單線程的概念沒(méi)有什么新的地方,真正有趣的是在一個(gè)程序中同時(shí)使用多個(gè)線程來(lái)完成不同的任務(wù)。某些地方用輕量進(jìn)程(LightweightProcess)來(lái)代替線程,線程與真正進(jìn)程的相似性在于它們都是單一順序控制流。然而線程被認(rèn)為輕量是由于它運(yùn)行于整個(gè)程序的上下文內(nèi),能使用整個(gè)程序共有的資源和程序環(huán)境。


  作為單一順序控制流,在運(yùn)行的程序內(nèi)線程必須擁有一些資源作為必要的開(kāi)銷。例如,必須有執(zhí)行堆棧和程序計(jì)數(shù)器在線程內(nèi)執(zhí)行的代碼只在它的上下文中起作用,因此某些地方用"執(zhí)行上下文"來(lái)代替"線程"。


Java多線程學(xué)習(xí),深入解析.jpg


  線程屬性


  為了正確有效地使用線程,必須理解線程的各個(gè)方面并了解Java實(shí)時(shí)系統(tǒng)。必須知道如何提供線程體、線程的生命周期、實(shí)時(shí)系統(tǒng)如何調(diào)度線程、線程組、什么是幽靈線程(DemonThread)。


  (1)線程體


  所有的操作都發(fā)生在線程體中,在Java中線程體是從Thread類繼承的run()方法,或?qū)崿F(xiàn)Runnable接口的類中的run()方法。當(dāng)線程產(chǎn)生并初始化后,實(shí)時(shí)系統(tǒng)調(diào)用它的run()方法。run()方法內(nèi)的代碼實(shí)現(xiàn)所產(chǎn)生線程的行為,它是線程的主要部


  分。


  (2)線程狀態(tài)


  附圖表示了線程在它的生命周期內(nèi)的任何時(shí)刻所能處的狀態(tài)以及引起狀態(tài)改變的方法。這圖并不是完整的有限狀態(tài)圖,但基本概括了線程中比較感興趣和普遍的方面。以下討論有關(guān)線程生命周期以此為據(jù)。


  ●新線程態(tài)(NewThread)


  產(chǎn)生一個(gè)Thread對(duì)象就生成一個(gè)新線程。當(dāng)線程處于"新線程"狀態(tài)時(shí),僅僅是一個(gè)空線程對(duì)象,它還沒(méi)有分配到系統(tǒng)資源。因此只能啟動(dòng)或終止它。任何其他操作都會(huì)引發(fā)異常。


  ●可運(yùn)行態(tài)(Runnable)


  start()方法產(chǎn)生運(yùn)行線程所必須的資源,調(diào)度線程執(zhí)行,并且調(diào)用線程的run()方法。在這時(shí)線程處于可運(yùn)行態(tài)。該狀態(tài)不稱為運(yùn)行態(tài)是因?yàn)檫@時(shí)的線程并不總是一直占用處理機(jī)。特別是對(duì)于只有一個(gè)處理機(jī)的PC而言,任何時(shí)刻只能有一個(gè)處于可運(yùn)行態(tài)的線程占用處理機(jī)。Java通過(guò)調(diào)度來(lái)實(shí)現(xiàn)多線程對(duì)處理機(jī)的共享。


  ●非運(yùn)行態(tài)(NotRunnable)


  當(dāng)以下事件發(fā)生時(shí),線程進(jìn)入非運(yùn)行態(tài)。


 ?、賡uspend()方法被調(diào)用;


 ?、趕leep()方法被調(diào)用;


 ?、劬€程使用wait()來(lái)等待條件變量;


  ④線程處于I/O等待


  ●死亡態(tài)(Dead)


  當(dāng)run()方法返回,或別的線程調(diào)用stop()方法,線程進(jìn)入死亡態(tài)。通常Applet使用它的stop()方法來(lái)終止它產(chǎn)生的所有線程。

Java多線程學(xué)習(xí),深入解析.jpg

  (3)線程優(yōu)先級(jí)


  雖然我們說(shuō)線程是并發(fā)運(yùn)行的。然而事實(shí)常常并非如此。正如前面談到的,當(dāng)系統(tǒng)中只有一個(gè)CPU時(shí),以某種順序在單CPU情況下執(zhí)行多線程被稱為調(diào)度(scheduling)。Java采用的是一種簡(jiǎn)單、固定的調(diào)度法,即固定優(yōu)先級(jí)調(diào)度。這種算法是根據(jù)處于可運(yùn)行態(tài)線程的相對(duì)優(yōu)先級(jí)來(lái)實(shí)行調(diào)度。當(dāng)線程產(chǎn)生時(shí),它繼承原線程的優(yōu)先級(jí)。在需要時(shí)可對(duì)優(yōu)先級(jí)進(jìn)行修改。在任何時(shí)刻,如果有多條線程等待運(yùn)行,系統(tǒng)選擇優(yōu)先級(jí)最高的可運(yùn)行線程運(yùn)行。只有當(dāng)它停止、自動(dòng)放棄、或由于某種原因成為非運(yùn)行態(tài)低優(yōu)先級(jí)的線程才能運(yùn)行。如果兩個(gè)線程具有相同的優(yōu)先級(jí),它


  們將被交替地運(yùn)行。


  Java實(shí)時(shí)系統(tǒng)的線程調(diào)度算法還是強(qiáng)制性的,在任何時(shí)刻,如果一個(gè)比其他線程優(yōu)先級(jí)都高的線程的狀態(tài)變?yōu)榭蛇\(yùn)行態(tài),實(shí)時(shí)系統(tǒng)將選擇該線程來(lái)運(yùn)行。


  (4)幽靈線程


  任何一個(gè)Java線程都能成為幽靈線程。它是作為運(yùn)行于同一個(gè)進(jìn)程內(nèi)的對(duì)象和線程的服務(wù)提供者。例如,HotJava瀏覽器有一個(gè)稱為"后臺(tái)圖片閱讀器"的幽靈線程,它為需要圖片的對(duì)象和線程從文件系統(tǒng)或網(wǎng)絡(luò)讀入圖片。幽靈線程是應(yīng)用中典型的獨(dú)立線程。它為同一應(yīng)用中的其他對(duì)象和線程提供服務(wù)。幽靈線程的run()方法一般都是無(wú)限循環(huán),等待服務(wù)請(qǐng)求。


  (5)線程組


  每個(gè)Java線程都是某個(gè)線程組的成員。線程組提供一種機(jī)制,使得多個(gè)線程集于一個(gè)對(duì)象內(nèi),能對(duì)它們實(shí)行整體操作。譬如,你能用一個(gè)方法調(diào)用來(lái)啟動(dòng)或掛起組內(nèi)的所有線程。Java線程組由ThreadGroup類實(shí)現(xiàn)。當(dāng)線程產(chǎn)生時(shí),可以指定線程組或由實(shí)時(shí)系統(tǒng)將其放入某個(gè)缺省的線程組內(nèi)。線程只能屬于一個(gè)線程組,并且當(dāng)線程產(chǎn)生后不能改變它所屬的線程組。


  多線程程序


  對(duì)于多線程的好處這就不多說(shuō)了。但是,它同樣也帶來(lái)了某些新的麻煩。只要在設(shè)計(jì)程序時(shí)特別小心留意,克服這些麻煩并不算太困難。


  (1)同步線程


  許多線程在執(zhí)行中必須考慮與其他線程之間共享數(shù)據(jù)或協(xié)調(diào)執(zhí)行狀態(tài)。這就需要同步機(jī)制。在Java中每個(gè)對(duì)象都有一把鎖與之對(duì)應(yīng)。但Java不提供單獨(dú)的lock和unlock操作。它由高層的結(jié)構(gòu)隱式實(shí)現(xiàn),來(lái)保證操作的對(duì)應(yīng)。(然而,我們注意到Java虛擬機(jī)提供單獨(dú)的monitorenter和monitorexit指令來(lái)實(shí)現(xiàn)lock和unlock操作。)


  synchronized語(yǔ)句計(jì)算一個(gè)對(duì)象引用,試圖對(duì)該對(duì)象完成鎖操作,并且在完成鎖操作前停止處理。當(dāng)鎖操作完成synchronized語(yǔ)句體得到執(zhí)行。當(dāng)語(yǔ)句體執(zhí)行完畢(無(wú)論正?;虍惓?,解鎖操作自動(dòng)完成。作為面向?qū)ο蟮恼Z(yǔ)言,synchronized經(jīng)常與方法連用。一種比較好的辦法是,如果某個(gè)變量由一個(gè)線程賦值并由別的線程引用或賦值,那么所有對(duì)該變量的訪問(wèn)都必須在某個(gè)synchromized語(yǔ)句或synchronized方法內(nèi)。


  現(xiàn)在假設(shè)一種情況:線程1與線程2都要訪問(wèn)某個(gè)數(shù)據(jù)區(qū),并且要求線程1的訪問(wèn)先于線程2,則這時(shí)僅用synchronized是不能解決問(wèn)題的。這在Unix或WindowsNT中可用Simaphore來(lái)實(shí)現(xiàn)。而Java并不提供。在Java中提供的是wait()和notify()機(jī)制。使用如下:


  synchronizedmethod-1(…){callbythread1.


  ∥accessdataarea;


  available=true;


  notify()


  }


  synchronizedmethod-2(…){∥callbythread2.


  while(!available)


  try{


  wait();∥waitfornotify().


  }catch(InterruptedExceptione){


  }


  ∥accessdataarea


  }


  其中available是類成員變量,置初值為false。如果在method-2中檢查available為假,則調(diào)用wait()。wait()的作用是使線


  程2進(jìn)入非運(yùn)行態(tài),并且解鎖。在這種情況下,method-1可以被線程1調(diào)用。當(dāng)執(zhí)行notify()后。線程2由非運(yùn)行態(tài)轉(zhuǎn)變?yōu)榭蛇\(yùn)行態(tài)。當(dāng)method-1調(diào)用返回后。線程2可重新對(duì)該對(duì)象加鎖,加鎖成功后執(zhí)行wait()返回后的指令。這種機(jī)制也能適用于其他更復(fù)雜的情況。


  (2)死鎖


  如果程序中有幾個(gè)競(jìng)爭(zhēng)資源的并發(fā)線程,那么保證均衡是很重要的。系統(tǒng)均衡是指每個(gè)線程在執(zhí)行過(guò)程中都能充分訪問(wèn)有限的資源。系統(tǒng)中沒(méi)有餓死和死鎖的線程。Java并不提供對(duì)死鎖的檢測(cè)機(jī)制。對(duì)大多數(shù)的Java程序員來(lái)說(shuō)防止死鎖是一種較好的選擇。最簡(jiǎn)單的防止死鎖的方法是對(duì)競(jìng)爭(zhēng)的資源引入序號(hào),如果一個(gè)線程需要幾個(gè)資源,那么它必須先得到小序號(hào)的資源,再申請(qǐng)大序號(hào)的資源。


  小結(jié)


  線程是Java中的重要內(nèi)容,多線程是Java的一個(gè)特點(diǎn)。雖然Java的同步互斥不如某些系統(tǒng)那么豐富,但適當(dāng)?shù)厥褂盟鼈円材苁盏綕M意的效果。


  


提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)

  • 全國(guó)校區(qū) 2025-05-15 搶座中
  • 全國(guó)校區(qū) 2025-06-05 搶座中
  • 全國(guó)校區(qū) 2025-06-26 搶座中
免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 中文字幕一区在线 | 亚洲成人黄色网址 | 韩日一级毛片 | 日本欧美一区二区三区高清 | 精品欧美日韩一区二区三区 | 国产特级毛片aaaaaaa高清 | 国产精品视频网址 | 在线中文字幕第一页 | 国产一级片视频 | 一个人www免费观看视频 | 国产亚洲欧美日韩在线观看不卡 | 一区二区三区欧美视频 | 午夜激情在线视频 | 国产高清精品入口麻豆 | 一级毛片在线不卡直接观看 | 狠狠躁夜夜躁人人躁婷婷视频 | 国产色婷婷精品综合在线 | 最近中文字幕在线观看 | a级黄色片网站 | 欧美日韩一区二区三区韩大 | 伊人天堂在线 | a级黄色毛片视频 | 免费一级在线观看 | 午夜一区二区免费视频 | 国产三级a三级三级野外 | aaa国产| 欧美日韩另类国产 | 日韩三级在线观看 | 今天免费中文字幕视频 | 最近2019年最中文字幕视频 | 性欧美video高清 | 一 级 黄 色 片生活片 | 色伊人网 | 免费永久观看美女视频网站网址 | 亚洲国产亚洲片在线观看播放 | 亚洲欧美成人综合 | 欧美激情_区二区三区 | 一级女性全黄久久生活片免费 | 国产国语videosex | 五月天婷婷在线视频 | 无遮挡高清一级毛片免费 |