十五章及多線程_第1頁
十五章及多線程_第2頁
十五章及多線程_第3頁
十五章及多線程_第4頁
十五章及多線程_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第十五章線程及多線程

本講內(nèi)容線程的定義多線程舉例線程的創(chuàng)建與啟動(dòng)兩種實(shí)現(xiàn)多線程方法的比較本講目標(biāo)線程的創(chuàng)建與啟動(dòng)兩種實(shí)現(xiàn)多線程方法的比較線程的定義什么是程序?程序是一段靜態(tài)的代碼,它是應(yīng)用程序執(zhí)行的藍(lán)本。什么是進(jìn)程?進(jìn)程是指一種正在運(yùn)行的程序,有自己的地址空間。作為藍(lán)本的程序可以被多次加載到系統(tǒng)的不同內(nèi)存區(qū)域分別執(zhí)行,形成不同的進(jìn)程。基于進(jìn)程的特點(diǎn)是允許計(jì)算機(jī)同時(shí)運(yùn)行兩個(gè)或更多的程序。什么是線程?線程是進(jìn)程內(nèi)部單一的一個(gè)順序控制流。一個(gè)進(jìn)程在執(zhí)行過程中,可以產(chǎn)生多個(gè)線程。每個(gè)線程也有自己產(chǎn)生、存在和消亡的過程。進(jìn)程是系統(tǒng)資源分配的單位,可包括多個(gè)線程。線程是獨(dú)立調(diào)度和分派的基本單位,共享進(jìn)程資源。引入進(jìn)程是為了多個(gè)程序并發(fā)執(zhí)行,提高資源的利用率和系統(tǒng)吞吐量引入線程,是為了減少程序在并發(fā)執(zhí)行時(shí)所付出的時(shí)空開銷多線程多線程編程的含義是將程序任務(wù)分成幾個(gè)并行的子任務(wù),常用于網(wǎng)絡(luò)編程中。多線程是與單線程比較而言的普通的Windows采用多線程程序結(jié)構(gòu),其工作原理是:主程序有一個(gè)消息循環(huán),不斷從消息隊(duì)列中讀入消息來決定下一步所要干的事情,一般是針對一個(gè)函數(shù),只有等這個(gè)函數(shù)執(zhí)行完之后,主程序才能接收另外的消息來執(zhí)行。在執(zhí)行這個(gè)子函數(shù)過程中你什么也不能干,但往往讀網(wǎng)絡(luò)數(shù)據(jù)和等待用戶輸入有很多時(shí)間處于等待狀態(tài),多線程利用這個(gè)特點(diǎn)將任務(wù)分成多個(gè)并發(fā)任務(wù)后,就可以解決這個(gè)問題多線程的好處多線程的優(yōu)點(diǎn)多線程使系統(tǒng)的空轉(zhuǎn)時(shí)間最少,提高CPU利用率共享資源,不浪費(fèi)內(nèi)存。線程間的信息傳遞容易。線程控制靈活,可在程序中自由調(diào)度。如何實(shí)現(xiàn)多線程?Java中實(shí)現(xiàn)多線程的類有兩種方法:擴(kuò)展java.lang.Thread類,覆蓋Thread類的run方法。生成實(shí)現(xiàn)java.lang.Runnable接口的類并將其它的實(shí)例與java.lang.Thread實(shí)例相關(guān)聯(lián)。Thread類是負(fù)責(zé)向其它類提供線程支持的最主要的類,要使用一個(gè)類具有線程功能,在Java中只要簡單地從Thread類派生一個(gè)子類就可以了。多線程舉例—Thread類classThreadDemo1{ public

static

voidmain(Stringargs[]){

MyThreadt=newMyThread(); t.start(); while(true){ System.out.println("mainthreadisrunning"); } }}classMyThreadextendsThread{ public

void

run(){

while(true){ System.out.println(Thread.currentThread().getName()+"isrunning"); } }}多線程舉例—Runnable接口classThreadDemo1{ public

static

voidmain(Stringargs[]){

MyThreadmt=newMyThread(); Threadt=newThread(mt); t.start();

while(true){ System.out.println("mainthreadisrunning"); } }}classMyThreadimplementsRunnable{

public

void

run(){

while(true){ System.out.println(Thread.currentThread().getName()+"isrunning"); } }}線程的創(chuàng)建與啟動(dòng)兩種方法來創(chuàng)建線程:繼承Java.lang.Thread類,并覆蓋run()方法。classMyThreadextendsThread{publicvoidrun(){/*覆蓋該方法*/}}實(shí)現(xiàn)Java.lang.Runnable接口,并實(shí)現(xiàn)run()方法。 classMyThreadimplementsRunnable{publicvoidrun(){/*實(shí)現(xiàn)該方法*/}}線程的創(chuàng)建與啟動(dòng)新建的線程不會(huì)自動(dòng)開始運(yùn)行,必須通過start()方法啟動(dòng)線程。如果不調(diào)用這個(gè)方法,線程將不會(huì)運(yùn)行。也就是說可以事先創(chuàng)建線程,并在需要的時(shí)候才啟動(dòng)他們。如:繼承Thread的線程:MyThreadt=newMyThread();t.start();實(shí)現(xiàn)Runnable接口的線程:MyThreadmt=newMyThread();Threadt=newThread(mt);t.start();線程的創(chuàng)建與啟動(dòng)主線程介紹在Java程序啟動(dòng)時(shí),一個(gè)線程立刻運(yùn)行,該線程通常稱為程序的主線程。Main就是在這個(gè)線程上運(yùn)行。當(dāng)不再產(chǎn)生新的線程時(shí),程序是單線程的。主線程的重要性體現(xiàn)在兩個(gè)方面:它是產(chǎn)生其他子線程的線程。通常它必須最后完成執(zhí)行,因?yàn)樗鼒?zhí)行各種關(guān)閉動(dòng)作線程的四種狀態(tài)新狀態(tài):線程已被創(chuàng)建但尚未執(zhí)行(start()尚未被調(diào)用)。可執(zhí)行狀態(tài):線程可以執(zhí)行,雖然不一定正在執(zhí)行。CPU時(shí)間隨時(shí)可能被分配給該線程,從而使得它執(zhí)行。死亡狀態(tài):正常情況下run()返回使得線程死亡。調(diào)用stop()或destroy()亦有同樣效果,但是不被推薦,前者會(huì)產(chǎn)生異常,后者是強(qiáng)制終止,不會(huì)釋放鎖。阻塞狀態(tài):線程不會(huì)被分配CPU時(shí)間,無法執(zhí)行。線程的創(chuàng)建與啟動(dòng)方法用途staticThreadcurrentThread()得到當(dāng)前線程finalStringgetName()返回線程的名稱finalvoidsetName(Stringname)將線程的名稱設(shè)置為由name指定的名稱voidstart()調(diào)用run()方法啟動(dòng)線程,開始線程的執(zhí)行voidrun()存放線程體代碼Thread中常用方法線程的創(chuàng)建與啟動(dòng)示例得到當(dāng)前線程,并為其改名例子publicclassMainThreadDemo{publicstaticvoidmain(Stringargs[]){

Threadt=Thread.currentThread();System.out.println(“當(dāng)前線程名稱是:"+t.getName());

t.setName("MyJavaThread");

System.out.println(“改名后線程名稱是:"+t.getName());System.out.println("輸出當(dāng)前線程"+t);}}兩種實(shí)現(xiàn)多線程方法的比較classMyThreadextendsThread{private

inttickets=100;public

voidrun(){while(true){if(tickets>0)System.out.println(Thread.currentThread().getName()+"issallingticket"+tickets--);}}}classTest{public

static

voidmain(String[]args){MyThreadmt=newMyThread();mt.start();mt.start();mt.start();mt.start();}}使用extendsThread方法一個(gè)Thread對象只能啟動(dòng)一個(gè)線程,無論調(diào)用幾次start()方法結(jié)果:一個(gè)窗口賣了100張票,其他窗口未賣實(shí)例:實(shí)現(xiàn)四個(gè)窗口共賣100張票效果兩種實(shí)現(xiàn)多線程方法的比較classMyThreadextendsThread{private

inttickets=10;public

voidrun(){while(true){if(tickets>0)System.out.println(Thread.currentThread().getName()+"issallingticket"+tickets--);}}}classTest{public

static

voidmain(String[]args){newMyThread().start();newMyThread().start();newMyThread().start();newMyThread().start();}}使用extendsThread方法結(jié)果:四個(gè)窗口各賣了100張票實(shí)例:實(shí)現(xiàn)四個(gè)窗口共賣100張票效果兩種實(shí)現(xiàn)多線程方法的比較classMyThreadimplementsRunnable{private

inttickets=100;public

voidrun(){while(true){if(tickets>0)System.out.println(Thread.currentThread().getName()+"issallingticket"+tickets--);}}}classTest{public

static

voidmain(String[]args){MyThreadmt=newMyThread();newThread(mt).start();newThread(mt).start();newThread(mt).start();newThread(mt).start();}}使用implementsRunable方法結(jié)果:四個(gè)窗口共賣了100張票實(shí)例:實(shí)現(xiàn)四個(gè)窗口共賣100張票效果兩種實(shí)現(xiàn)多線程方法的比較使用Runnable接口創(chuàng)建多線程的優(yōu)點(diǎn):同一個(gè)Runnable對象可以傳遞給多個(gè)線程,可以實(shí)現(xiàn)資源共享,所以適合多個(gè)相同程序代碼的線程去處理同一資源的情況可以避免由于Java的單繼承帶來的局限有利于程序的健壯性,代碼能被多個(gè)線程共享,代碼與數(shù)據(jù)是獨(dú)立的線程的優(yōu)先級線程在優(yōu)先級代表該線程的重要程度線程的優(yōu)先指當(dāng)有多個(gè)線程同時(shí)處于可執(zhí)行狀態(tài)并等待獲得CPU時(shí)間時(shí),線程調(diào)度系統(tǒng)根據(jù)各個(gè)線程的優(yōu)先級來決定給誰分配CPU時(shí)間,優(yōu)先級高的線程有更大的機(jī)會(huì)獲得CPU時(shí)間,優(yōu)先級低的線程也不是沒有機(jī)會(huì),只是機(jī)會(huì)要小一些罷了。

可調(diào)用Thread類的方法getPriority()和setPriority()來獲取或設(shè)置線程的優(yōu)先級線程的優(yōu)先級界于1(MIN_PRIORITY)和10(MAX_PRIORITY)之間,缺省是(NORM_PRIORITY)??蛻舸嫒】疃嗑€程實(shí)例產(chǎn)生數(shù)據(jù)不一致的原因多個(gè)線程并發(fā)訪問了同一個(gè)對象,如果破壞了不可分割的操作,從而就會(huì)造成數(shù)據(jù)不一致被多線程并發(fā)訪問時(shí)如果一個(gè)對象有可能出現(xiàn)數(shù)據(jù)不一致的問題,那么這個(gè)對象稱為線程不安全的對象線程同步如何解決多線程并發(fā)訪問的問題

synchronized(object){

代碼塊

}線程同步線程同步線程同步線程的管理線程包括new()開始、running()運(yùn)行、wait()等候和done()結(jié)束執(zhí)行四種狀態(tài)。第一次創(chuàng)建線程時(shí),都位于new狀態(tài),在這個(gè)狀態(tài)下,不能運(yùn)行線程,只能等待。這時(shí),線程要么調(diào)用start方法開始運(yùn)行,要么送往done狀態(tài)結(jié)束。位于done中的線程已經(jīng)結(jié)束執(zhí)行,這是線程的最后一個(gè)狀態(tài)。一旦線程位于這個(gè)狀態(tài),就不能再次出現(xiàn),而且當(dāng)Java虛擬機(jī)中的所有線程都位于done狀態(tài)時(shí),程序就強(qiáng)行中止。線程的管理當(dāng)前正在執(zhí)行的所有線程都位于running狀態(tài),在程序之間用某種方法把處理器的執(zhí)行時(shí)間分成時(shí)間片。位于running狀態(tài)的每個(gè)線程都是能運(yùn)行的,但在一個(gè)給定的時(shí)間內(nèi),每個(gè)系統(tǒng)處理器只能運(yùn)行一個(gè)線程。與位于running

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論