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

下載本文檔

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

文檔簡介

第十五章線程及多線程

本講內(nèi)容線程的定義多線程舉例線程的創(chuàng)建與啟動兩種實現(xiàn)多線程方法的比較本講目標(biāo)線程的創(chuàng)建與啟動兩種實現(xiàn)多線程方法的比較線程的定義什么是程序?程序是一段靜態(tài)的代碼,它是應(yīng)用程序執(zhí)行的藍(lán)本。什么是進(jìn)程?進(jìn)程是指一種正在運行的程序,有自己的地址空間。作為藍(lán)本的程序可以被多次加載到系統(tǒng)的不同內(nèi)存區(qū)域分別執(zhí)行,形成不同的進(jìn)程。基于進(jìn)程的特點是允許計算機(jī)同時運行兩個或更多的程序。什么是線程?線程是進(jìn)程內(nèi)部單一的一個順序控制流。一個進(jìn)程在執(zhí)行過程中,可以產(chǎn)生多個線程。每個線程也有自己產(chǎn)生、存在和消亡的過程。進(jìn)程是系統(tǒng)資源分配的單位,可包括多個線程。線程是獨立調(diào)度和分派的基本單位,共享進(jìn)程資源。引入進(jìn)程是為了多個程序并發(fā)執(zhí)行,提高資源的利用率和系統(tǒng)吞吐量引入線程,是為了減少程序在并發(fā)執(zhí)行時所付出的時空開銷多線程多線程編程的含義是將程序任務(wù)分成幾個并行的子任務(wù),常用于網(wǎng)絡(luò)編程中。多線程是與單線程比較而言的普通的Windows采用多線程程序結(jié)構(gòu),其工作原理是:主程序有一個消息循環(huán),不斷從消息隊列中讀入消息來決定下一步所要干的事情,一般是針對一個函數(shù),只有等這個函數(shù)執(zhí)行完之后,主程序才能接收另外的消息來執(zhí)行。在執(zhí)行這個子函數(shù)過程中你什么也不能干,但往往讀網(wǎng)絡(luò)數(shù)據(jù)和等待用戶輸入有很多時間處于等待狀態(tài),多線程利用這個特點將任務(wù)分成多個并發(fā)任務(wù)后,就可以解決這個問題多線程的好處多線程的優(yōu)點多線程使系統(tǒng)的空轉(zhuǎn)時間最少,提高CPU利用率共享資源,不浪費內(nèi)存。線程間的信息傳遞容易。線程控制靈活,可在程序中自由調(diào)度。如何實現(xiàn)多線程?Java中實現(xiàn)多線程的類有兩種方法:擴(kuò)展java.lang.Thread類,覆蓋Thread類的run方法。生成實現(xiàn)java.lang.Runnable接口的類并將其它的實例與java.lang.Thread實例相關(guān)聯(lián)。Thread類是負(fù)責(zé)向其它類提供線程支持的最主要的類,要使用一個類具有線程功能,在Java中只要簡單地從Thread類派生一個子類就可以了。多線程舉例—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)建與啟動兩種方法來創(chuàng)建線程:繼承Java.lang.Thread類,并覆蓋run()方法。classMyThreadextendsThread{publicvoidrun(){/*覆蓋該方法*/}}實現(xiàn)Java.lang.Runnable接口,并實現(xiàn)run()方法。 classMyThreadimplementsRunnable{publicvoidrun(){/*實現(xiàn)該方法*/}}線程的創(chuàng)建與啟動新建的線程不會自動開始運行,必須通過start()方法啟動線程。如果不調(diào)用這個方法,線程將不會運行。也就是說可以事先創(chuàng)建線程,并在需要的時候才啟動他們。如:繼承Thread的線程:MyThreadt=newMyThread();t.start();實現(xiàn)Runnable接口的線程:MyThreadmt=newMyThread();Threadt=newThread(mt);t.start();線程的創(chuàng)建與啟動主線程介紹在Java程序啟動時,一個線程立刻運行,該線程通常稱為程序的主線程。Main就是在這個線程上運行。當(dāng)不再產(chǎn)生新的線程時,程序是單線程的。主線程的重要性體現(xiàn)在兩個方面:它是產(chǎn)生其他子線程的線程。通常它必須最后完成執(zhí)行,因為它執(zhí)行各種關(guān)閉動作線程的四種狀態(tài)新狀態(tài):線程已被創(chuàng)建但尚未執(zhí)行(start()尚未被調(diào)用)。可執(zhí)行狀態(tài):線程可以執(zhí)行,雖然不一定正在執(zhí)行。CPU時間隨時可能被分配給該線程,從而使得它執(zhí)行。死亡狀態(tài):正常情況下run()返回使得線程死亡。調(diào)用stop()或destroy()亦有同樣效果,但是不被推薦,前者會產(chǎn)生異常,后者是強(qiáng)制終止,不會釋放鎖。阻塞狀態(tài):線程不會被分配CPU時間,無法執(zhí)行。線程的創(chuàng)建與啟動方法用途staticThreadcurrentThread()得到當(dāng)前線程finalStringgetName()返回線程的名稱finalvoidsetName(Stringname)將線程的名稱設(shè)置為由name指定的名稱voidstart()調(diào)用run()方法啟動線程,開始線程的執(zhí)行voidrun()存放線程體代碼Thread中常用方法線程的創(chuà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);}}兩種實現(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方法一個Thread對象只能啟動一個線程,無論調(diào)用幾次start()方法結(jié)果:一個窗口賣了100張票,其他窗口未賣實例:實現(xiàn)四個窗口共賣100張票效果兩種實現(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é)果:四個窗口各賣了100張票實例:實現(xiàn)四個窗口共賣100張票效果兩種實現(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é)果:四個窗口共賣了100張票實例:實現(xiàn)四個窗口共賣100張票效果兩種實現(xiàn)多線程方法的比較使用Runnable接口創(chuàng)建多線程的優(yōu)點:同一個Runnable對象可以傳遞給多個線程,可以實現(xiàn)資源共享,所以適合多個相同程序代碼的線程去處理同一資源的情況可以避免由于Java的單繼承帶來的局限有利于程序的健壯性,代碼能被多個線程共享,代碼與數(shù)據(jù)是獨立的線程的優(yōu)先級線程在優(yōu)先級代表該線程的重要程度線程的優(yōu)先指當(dāng)有多個線程同時處于可執(zhí)行狀態(tài)并等待獲得CPU時間時,線程調(diào)度系統(tǒng)根據(jù)各個線程的優(yōu)先級來決定給誰分配CPU時間,優(yōu)先級高的線程有更大的機(jī)會獲得CPU時間,優(yōu)先級低的線程也不是沒有機(jī)會,只是機(jī)會要小一些罷了。

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

synchronized(object){

代碼塊

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

溫馨提示

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

評論

0/150

提交評論