第07章多線程(信息學院2013級)_第1頁
第07章多線程(信息學院2013級)_第2頁
第07章多線程(信息學院2013級)_第3頁
第07章多線程(信息學院2013級)_第4頁
第07章多線程(信息學院2013級)_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第7章多線程7.1操作系統(tǒng)中的進程與線程7.2Java的線程對象7.3線程的同步機制1多線程程序示例(點名程序)設計思路:按照第6章的知識完成UI設計;完成在”開始點名”按鈕的事件處理方法通過jxl.jar包的方法打開studentName.xls文件通過隨機函數(shù),從excels文件讀取人名,顯示在TextField組件上2演示結(jié)果是:從console看到輸出了人名,可在TextField上沒有實時更新,只在最后才顯示出人的名字原因是什么?如何解決呢?Jxl.jar包使用3/link?url=bTQZKzyYAaKGeLpmymbFe_8zTpM6o3hWSyOeBHr2HiYcvpScPx-TONG2xSx3NB7gpHtCh_2O1asTJWnQ5y_hha

jxl.jar是通過java操作excel表格的工具類庫讀取文件publicstaticvoidmain(Stringargs[]){ try { Workbookbook= Workbook.getWorkbook(newFile(“測試.xls”)); Sheetsheet=book.getSheet(0); Cellcell1=sheet.getCell(0,0); Stringresult=cell1.getContents(); } ……..}7.1操作系統(tǒng)中的進程與線程進程線程并發(fā)程序設計41.進程1)進程的定義和屬性進程(process)是一個可并發(fā)執(zhí)行的具有獨立功能的程序(program)關于某個數(shù)據(jù)集合的一次執(zhí)行過程,也是操作系統(tǒng)進行資源分配和保護的基本單位。結(jié)構(gòu)性:進程包括程序塊、數(shù)據(jù)塊和進程控制塊三部分動態(tài)性:進程只程序的一次執(zhí)行過程,是動態(tài)的概念獨立性:進行是系統(tǒng)調(diào)度的獨立單位、是資源分配和保護的基本單位并發(fā)性:進程可以并發(fā)執(zhí)行,提高資源利用率和系統(tǒng)效率交互性

:多個進程可以共享變量,通過共享變量實現(xiàn)相互通信,多個進程能夠協(xié)作完成一個任務。5進程的狀態(tài)2)進程的狀態(tài)就緒(ready)態(tài):具備運行條件,等待系統(tǒng)分配資源以便運行運行(running)態(tài):進程占用系統(tǒng)資源正在運行阻塞(blocked)態(tài):正在等待某個事件任務的完成進程在執(zhí)行過程中的任一時刻,都處于某個狀態(tài),根據(jù)運行條件在多個狀態(tài)之間轉(zhuǎn)變。一個進程在創(chuàng)建后處于就緒狀態(tài),獲得處理器后處于運行狀態(tài),運行中因等待事件處于阻塞狀態(tài)。62.線程1)引入線程機制的動機和思路

動機:單線程進程調(diào)度存在進程時空開銷大、進程通信代價大、不適合并行計算等問題。

思路:將進程的兩項功能:“獨立分配資源”和“被調(diào)度分派執(zhí)行”分離,前一項仍由進程完成,后一項交給線程完成。優(yōu)點:進程作為資源分配和保護的獨立單元,不需要頻繁切換;線程作為系統(tǒng)調(diào)用和分派的基本單元,頻繁切換和調(diào)度。72)線程的定義和屬性線程(thread)是操作系統(tǒng)進程中能夠獨立執(zhí)行的實體(控制流),是處理器調(diào)度和分派的基本單位。線程是進程的組成部分;同一進程中的線程共享進程的內(nèi)存資源和空間;并發(fā)性共享性動態(tài)性結(jié)構(gòu)性8

3)線程的狀態(tài)

5)線程調(diào)度:任意時刻一個處理器上只能運行一個線程,其他線程排隊等待調(diào)度原則是同一優(yōu)先級采用先到先服務原則

線程剝奪原則有兩種:高優(yōu)先級、時間片結(jié)束93.并發(fā)程序設計1)順序程序設計的特點執(zhí)行的順序性。環(huán)境的封閉性。執(zhí)行結(jié)果的確定性。計算結(jié)果的可再現(xiàn)性。2)并發(fā)程序設計的特點:并發(fā)性:不一定按順序執(zhí)行;結(jié)果不確定性:線程之間會相互影響,執(zhí)行結(jié)果不確定;制約性:多線程之間相互交互,需要有機制相互制約,才能得到正確結(jié)果。并發(fā)程序設計優(yōu)點:提高性能、減少開銷等107.2Java的線程對象7.2.1Runnable接口與Thread類7.2.2線程對象的優(yōu)先級7.2.3線程對象的生命周期7.2.4定時器與圖形動畫設計117.2.1Runnable接口與Thread類Runnable接口publicinterfaceRunnable

{publicabstractvoidrun();}一個線程對象必須實現(xiàn)run()方法,描述該線程的所有活動及操作。已經(jīng)實現(xiàn)的run()方法稱為該對象的線程體12Runnable接口約定線程執(zhí)行的方法Thread類提供創(chuàng)建、管理和控制線程對象的方法2.Thread線程類publicclassThreadextendsObjectimplementsRunnable{publicThread() //構(gòu)造方法

publicThread(Stringname) //name指定線程名

publicThread(Runnabletarget)//target指定線程的目標對象

publicThread(Runnabletarget,Stringname)publicvoidrun() //描述線程操作的線程體publicfinalStringgetName()//返回線程名

publicfinalvoidsetName(Stringname)//設置線程名

publicstaticintactiveCount()//返回當前活動線程個數(shù)

publicstaticThreadcurrentThread()//返回當前執(zhí)行線程對象

publicStingtoString() //返回線程的字符串信息

publicvoidstart()//啟動已創(chuàng)建的線程對象}Java提供兩種實現(xiàn)多線程程序設計方法:繼承Thread類和實現(xiàn)Runnable接口;兩種方法的核心是實現(xiàn)run()方法——線程體13【例7.1】聲明繼承Thread類的奇數(shù)/偶數(shù)序列線程main是首先啟動執(zhí)行的線程兩個線程交替運行多線程程序結(jié)果具有不確定性,尤其是運行時間較長(輸出序列長)14【例7.2】聲明實現(xiàn)Runnable接口的奇數(shù)/偶數(shù)序列線程。Runnable接口實現(xiàn)多線程:

Thread構(gòu)造方法:publicThread(Runnabletarget);Thread的run方法:publicvoidrun()//描述線程操作的線程體{if(target!=null)

target.run();//執(zhí)行目標對象的run()方法}Threadt1=newThread();//t1的run()方法為空Threadthread_odd=newThread(odd,"奇數(shù)線程");153.兩種創(chuàng)建線程方式的比較(P189)兩種方法創(chuàng)建線程(1)繼承線程Thread類

聲明一個線程類繼承Thread類,實現(xiàn)run方法,說明線程對象所執(zhí)行的操作。優(yōu)點是具有Thread類聲明的方法,且具有線程體;缺點是不適用于多繼承。(2)實現(xiàn)Runnable接口

實現(xiàn)Runnable接口說明線程體所執(zhí)行操作,同時還需要聲明Thread對象來實現(xiàn)線程創(chuàng)建、啟動等操作。補充說明:JDK5提供線程池功能16線程池1.在什么情況下使用線程池?

(1)單個任務處理的時間比較短

(2)將需處理的任務的數(shù)量大2.使用線程池的好處:(1)減少在創(chuàng)建和銷毀線程上所花的時間以及系統(tǒng)資源的開銷

(2)如不使用線程池,有可能造成系統(tǒng)創(chuàng)建大量線程而導致消耗完系統(tǒng)內(nèi)存以及”過度切換”3.線程池的幾個概念(1)線程池(Threadpool),池是一個容器,容器中有很多個執(zhí)行器,每一個執(zhí)行器是一個線程。(2)執(zhí)行器(Executor),每個執(zhí)行器是一個線程,每個執(zhí)行器可以執(zhí)行一個任務。(3)任務(Task),任務是每個線程具體要做的事,如資源下載,播放flash片段,打印一段文字到控制臺等等,它本身不能執(zhí)行,而需要將自身交給執(zhí)行器。174.JDK自帶線程池

(1)newFixedThreadPool創(chuàng)建一個指定工作線程數(shù)量的線程池。每當提交一個任務就創(chuàng)建一個工作線程,如果工作線程數(shù)量達到線程池初始的最大數(shù),則將提交的任務存入到池隊列中。

(2)newCachedThreadPool創(chuàng)建一個可緩存的線程池。這種類型的線程池特點是:

1).工作線程的創(chuàng)建數(shù)量幾乎沒有限制(其實也有限制的,數(shù)目為Interger.

MAX_VALUE),

這樣可靈活的往線程池中添加線程。2).如果長時間沒有往線程池中提交任務,即如果工作線程空閑了指定的時間(默認為1分鐘),則該工作線程將自動終止。終止后,如果你又提交了新的任務,則線程池重新創(chuàng)建一個工作線程。

(3)newSingleThreadExecutor創(chuàng)建一個單線程化的Executor,即只創(chuàng)建唯一的工作者線程來執(zhí)行任務,如果這個線程異常結(jié)束,會有另一個取代它,保證順序執(zhí)行(我覺得這點是它的特色)。單工作線程最大的特點是可保證順序地執(zhí)行各個任務,并且在任意給定的時間不會有多個線程是活動的。

(4)

newScheduleThreadPool創(chuàng)建一個定長的線程池,而且支持定時的以及周期性的任務執(zhí)行,類似于Timer。187.2.2線程對象的優(yōu)先級Thread類中聲明了3個表示優(yōu)先級的公有靜態(tài)常量:publicstaticfinalintMIN__PRIORITY=1 //最低優(yōu)先級publicstaticfinalintMAX_PRIORITY=10 //最高優(yōu)先級publicstaticfinalintNORM_PRIORITY=5 //默認優(yōu)先級Thread類中與線程優(yōu)先級有關的方法有以下2個:publicfinalintgetPriority() //獲得線程優(yōu)先級publicfinalvoidsetPriority(intnewPriority)//設置線程優(yōu)先級在windows中,直接設置優(yōu)先級效果不明顯,NumberThread.java中演示197.2.3線程對象的生命周期Thread.State類聲明的線程狀態(tài)新建態(tài)、運行態(tài)、阻塞態(tài)和等待態(tài)、終止態(tài)線程的生命周期就是從新建到終止這個過程。202.Thread類中改變和判斷線程狀態(tài)的方法線程啟動publicvoidstart()//啟動線程對象publicfinalbooleanisAlive()//是否啟動線程睡眠publicstaticvoidsleep(longmillis)throwsInterruptedException線程中斷publicvoidinterrupt()//設置中斷標記publicbooleanisInterrupted()//判斷是否中斷publicstaticbooleaninterrupted()//判斷是否中斷21【例7.3】設計滾動字演示線程狀態(tài)及改變方法。本例演示線程對象的生命周期從創(chuàng)建到終止的過程,期間使用new、start()、sleep()、interrupt()等方法改變線程的狀態(tài)。本例綜合運用內(nèi)部類、圖形用戶界面、線程等多方面技術(shù)實現(xiàn)設計思想。聲明自定義面板類為私有內(nèi)部類并實現(xiàn)多個接口對象嵌套線程狀態(tài)變化代碼簡要說明:WelcomeJFrame構(gòu)造方法中,創(chuàng)建多個RollbyJPanel,每個對應一個滾動字小窗口和一個線程啟動、中斷以及sleep文本框都注冊ActionListener在事件處理器中對線程進行start、interrupt操作227.2.4定時器與圖形動畫設計publicclassTimerimplementsSerializable{publicTimer(intdelay,ActionListenerl)

publicvoidaddActionListener(ActionListenerl)//注冊定時事件監(jiān)聽器

publicvoidsetDelay(intdelay)//設置延時的時間間隔

publicvoidstart()//啟動定時器

publicvoidstop()//停止定時器

publicvoidrestart()//重新啟動定時器}【例7.4】彈彈球,使用定時器實現(xiàn)圖形動畫。代碼簡要說明:BallsCanvas構(gòu)造方法中,創(chuàng)建并啟動了定時器,定時器時間處理方法中repaint;同時注冊了FocusListenerBallsJFrame構(gòu)造方法中,為Jspinner組件注冊了ChangeListener23java.util.TimerpublicclassTimerimplementsSerializable{publicTimer()//創(chuàng)建新定時器publicvoidschedule(TimerTasktask,longdelay)

//安排在指定延遲后執(zhí)行指定的任務。publicvoidschedule(TimerTasktask,longdelay,longperiod)//安排指定的任務從指定的延遲后開始進行重復的固定延遲執(zhí)行。publicvoidcancel()//終止此計時器,丟棄所有當前已安排的任務。}247.3線程的同步機制7.3.1交互線程7.3.2線程間的競爭關系與線程互斥7.3.3線程間的協(xié)作關系與線程同步如果并發(fā)執(zhí)行的多個線程問需要共享資源或交換數(shù)據(jù),則稱這一組線程為交互線程。交互線程并發(fā)執(zhí)行時相互之間會干擾或影響其他線程的執(zhí)行結(jié)果,因此交互線程間需要有同步機制。

25無關線程與交互線程無關線程:并發(fā)線程操作不同的變量集合。操作的結(jié)果不會相互影響。如前面的奇偶數(shù)打印的兩個線程交互線程:并發(fā)線程共享某些變量,一個線程執(zhí)行過程中修改的變量值有可能影響到其他線程的執(zhí)行結(jié)果。交互線程的控制:由于交互線程之間有相互的制約關系,所以需要對其進行控制,否則結(jié)果就有可能不正確267.3.1交互線程271.線程交互交互線程間存在兩種關系:競爭關系和協(xié)作關系。競爭關系的交互線程間需要采用線程互斥方式解決共享資源沖突問題。協(xié)作關系的交互線程間需要采用線程同步方式解決線程問通信及因執(zhí)行速度不同而引起的不同步問題。線程的同步機制包括線程互斥和線程同步,線程互斥是線程同步的特殊情況【例7.5】銀行賬戶的存/取款線程設計。圖7.7并發(fā)線程共享臨界資源2.并發(fā)執(zhí)行的交互線程間存在與時間有關的錯誤結(jié)果的原因分析:有3個線程同時操作wang帳號,由于線程調(diào)度的因素,在某個線程執(zhí)行的過程中(還沒有結(jié)束),會被中斷執(zhí)行,轉(zhuǎn)而執(zhí)行另外一個線程。287.3.2線程間的競爭關系與線程互斥線程間的競爭關系兩個線程共享同一資源,一個線程獲得該資源,另一個線程就必須等待。極端的狀態(tài):被阻塞線程永遠得不到訪問權(quán)。出現(xiàn)兩個問題:死鎖、饑餓。292.線程互斥和臨界區(qū)管理操作系統(tǒng)對共享一個變量的若干線程進入各自臨界區(qū)有以下3個調(diào)度原則:一次至多一個線程能夠在它的臨界區(qū)內(nèi)。不能讓一個線程無限地留在它的臨界區(qū)內(nèi)。不能強迫一個線程無限地等待進入它的臨界區(qū)。特別地,進入臨界區(qū)的任一線程不能妨礙正等待進入的其他線程的進展。臨界資源:多線程共享變量代表的資源稱為臨界資源;臨界區(qū):并發(fā)線程中與共享變量有關的程序段稱為臨界區(qū)303.Java的線程互斥實現(xiàn)(1)同步語句synchronized(對象)//對象即臨界資源

語句//語句塊為臨界區(qū)(2)同步方法synchronized方法聲明//同步方法體為臨界區(qū)基于操作系統(tǒng)對于線程進入臨界區(qū)的3條原則,可以使用同步語句和同步方法來實現(xiàn)線程互斥。31【例7.6】互斥的存/取款線程設計。圖7.9帶互斥鎖的并發(fā)線程執(zhí)行流程32線程體中互斥鎖的用法publicvoidrun(){synchronized(this.account)//聲明臨界區(qū),鎖定指定賬戶對象

{doublehowmatch=this.account.balance();try{ Thread.sleep(1);}//花費時間catch(InterruptedExceptione){}this.account.put(this.value);System.out.println(this.account.getName()+"賬戶:現(xiàn)有"+howmatch+",存入"+this.value+",余額"+this.account.balance());}}保證了存錢或取錢操作過程中不會被其他線程中斷只有完成一次性完整存錢或取錢操作,才把資源釋放給其他線程。33同步方法實現(xiàn)互斥34 publicvoidrun(){ doRun(); } publicsynchronizedvoiddoRun(){ doublehowmatch=this.account.balance(); try{ Thread.sleep(1);//花費時間

}catch(InterruptedExceptione){ } this.account.put(this.value); System.out.println(this.account.getName()+"賬戶:現(xiàn)有"+howmatch+",存入" +this.value+",余額"+this.account.balance()); }7.3.3線程間的協(xié)作關系與線程同步線程間的協(xié)作關系

多個線程共同完成一個任務而分工協(xié)作,但是每個線程都是獨立的速度在執(zhí)行,需要在某些特定的協(xié)調(diào)點上實現(xiàn)線程之間的同步。【例7.7】發(fā)送線程與接收線程。例子分析:發(fā)送線程向buffer里面存數(shù)據(jù),接收線程從buffer里面去數(shù)據(jù)理想情況是:發(fā)送線程存一個,接收線程取一個實際情況:由于兩個線程是獨立運行,步調(diào)不一定一致。解決思路:發(fā)送線程存完數(shù)據(jù)后,通知接收線程來??;接收線程取完數(shù)據(jù)后通知發(fā)送線程可以繼續(xù)存數(shù)據(jù)。35線程間的協(xié)作關系:當一個進程中多個線程分工協(xié)作完成同一任務時,它們之間彼此有聯(lián)系,而且受其他線程執(zhí)行結(jié)果的影響。這些線程之間有直接制約關系。由于各個線程都是獨立以不可預知的速度推進,需要協(xié)作的線程必須在某些事先設置的協(xié)調(diào)點上協(xié)調(diào)各自的工作。當某個線程到達協(xié)調(diào)點,而其他線程還未到達時,其需要阻塞自己,直到其他合作線程發(fā)來協(xié)調(diào)信號后方被喚醒繼續(xù)執(zhí)行。36線程同步是解決線程協(xié)作關系的手段。線程互斥(存取款的例子)是線程同步的特殊例子。即逐次使用互斥共享資源。2.線程同步373.線程同步機制線程同步機制設置信號為共享變量(協(xié)調(diào)點變量)約定一個信號量(Semaphore),信號量有多種狀態(tài)。對信號量有P(測試信號量)操作和V(改變信號量)操作;線程根據(jù)信號量狀態(tài)而執(zhí)行多線程根據(jù)P操作獲得信號狀態(tài),并根據(jù)信號量狀態(tài)決定哪個線程執(zhí)行,執(zhí)行后進行V操作如以Buffer的狀態(tài)為信號量,發(fā)送線程檢測狀態(tài)為空(P操作)才發(fā)送數(shù)據(jù),發(fā)送后將狀態(tài)只為滿(V操作)接收線程檢測狀態(tài)為滿(P操作)才接收數(shù)據(jù),接收后將狀態(tài)置空(V操作)384.線程通信方法Java的線程通信方法publicfinalvoidwait()throwsInterruptedException//等待—阻塞本線程publicfinalnativevoidnotify(); //喚醒一個等待線程publicfinalnativevoidnotifyAll(); //喚醒所有等待線程線程通信方法結(jié)合信號量的PV操作就可以實現(xiàn)線程間的協(xié)作。39【例7.8】采用信號量和同步方法使發(fā)送線程與接收線程同步運行。圖7.11發(fā)送線程與接收線程同步執(zhí)行流程40【例7.9】發(fā)牌程序。圖7.121個發(fā)牌線程與4個取牌線程程序說明:約定一個緩沖區(qū)存放一張牌,緩沖區(qū)狀態(tài)設置為信號量發(fā)牌線程,一次產(chǎn)生1~52中的一個數(shù),每次發(fā)送一個數(shù)字到緩沖區(qū)4取牌線程編號為0~3,約定依次從緩沖區(qū)里取牌發(fā)牌線程優(yōu)先級高于取牌線程,任何一個取牌線程執(zhí)行后切換到發(fā)牌線程執(zhí)行41程序分析:緩沖區(qū)狀態(tài)設置為信號量isEmpty,用來保證發(fā)牌線程和取牌線程之間的同步;為保證4個發(fā)牌線程之間的同步,需要設置一個取牌次序信號量order,這個信號量有4個狀態(tài),約定為0~3,每個狀態(tài)表示一個取牌線程能夠執(zhí)行。線程的通信主要發(fā)生在發(fā)牌線程和取牌線程之間。理解信號量PV操作以及線程間通過wait和notify方法進行通信。42修改程序,實現(xiàn)隨機發(fā)牌程序思路:修改發(fā)牌線程,先把1~52的數(shù)字洗亂,存放到列表中;發(fā)牌時,從列表中依次取出亂序后的數(shù)字。431.什么是進程?什么是線程?進程與線程的關系是怎樣的?習題44【答】進程:進程是一個可并發(fā)的具有獨立功能的程序關于某個數(shù)據(jù)集合的一次執(zhí)行過程,也是操作系統(tǒng)進行資源分配和保護的基本單位。線程:線程是操作系統(tǒng)進程中能夠獨立執(zhí)行的實體,是處理器調(diào)度和分派的基本單位。線程是進程的組成部分,每個進程內(nèi)允許包含多個并發(fā)執(zhí)行的線程。2.操作系統(tǒng)為什么要支

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論