第8章java的多線(xiàn)程-唐大仕出版物、相關(guān)資料下載_第1頁(yè)
已閱讀1頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Java程序設(shè)計(jì),第8章 多線(xiàn)程,8.1 線(xiàn)程及其創(chuàng)建8.1.1 Java中的線(xiàn)程,Java程序通過(guò)流控制來(lái)執(zhí)行程序流,程序中單個(gè)順序的流控制稱(chēng)為線(xiàn)程,多線(xiàn)程則指的是在單個(gè)程序中可以同時(shí)運(yùn)行多個(gè)不同的線(xiàn)程執(zhí)行不同的任務(wù)。 單個(gè)程序內(nèi)部也可以在同一時(shí)刻進(jìn)行多種運(yùn)算。很多程序語(yǔ)言需要利用外部的線(xiàn)程軟件包來(lái)實(shí)現(xiàn)多線(xiàn)程,而Java則內(nèi)在支持多線(xiàn)程,它的所有類(lèi)都是在多線(xiàn)程的思想下定義的。,線(xiàn)程,線(xiàn)程就是程序中單獨(dú)順序的流控制。Jav

2、a的線(xiàn)程是通過(guò)Java的軟件包java.lang中定義的類(lèi)Thread來(lái)實(shí)現(xiàn)的。,線(xiàn)程體,線(xiàn)程的所有活動(dòng)都是通過(guò)線(xiàn)程體---- run()方法來(lái)實(shí)現(xiàn)的。在一個(gè)線(xiàn)程被建立并初始化以后,Java的運(yùn)行時(shí)系統(tǒng)就自動(dòng)調(diào)用run()方法。正是通過(guò)run()方法才使得建立線(xiàn)程的目的得以實(shí)現(xiàn)。通常,run()方法是一個(gè)循環(huán),例如一個(gè)播放動(dòng)畫(huà)的線(xiàn)程要循環(huán)顯示一系列圖片。有時(shí),run()方法會(huì)執(zhí)行一個(gè)時(shí)間較長(zhǎng)的操作,例如下載并播放一個(gè)JPEG格式

3、的電影。,8.1.2 創(chuàng)建線(xiàn)程對(duì)象的兩種方法,1.通過(guò)繼承Thread類(lèi)創(chuàng)建線(xiàn)程class MyThread extends Thread {public void run() {for(int i=0;i<100;i++) {System.out.print (" " + i);}}2.通過(guò)向Thread()構(gòu)造方法傳遞Runnable對(duì)象來(lái)創(chuàng)建線(xiàn)程class MyTask

4、 implements Runnable {public void run() { …}}Thread thread = new Thread(mytask);thread.start();3. 可用匿名類(lèi)來(lái)實(shí)現(xiàn)Runnable,如TestThread4Anonymous.java,8.1.3 多線(xiàn)程,TestThread3.java 多線(xiàn)程。 ThreadDraw.java 多線(xiàn)程繪圖。,8.2 線(xiàn)程的控制,,8.2

5、.1 線(xiàn)程的狀態(tài)與生命周期,在一個(gè)線(xiàn)程的生命周期中,它總處于某一種狀態(tài)中。線(xiàn)程的狀態(tài)表示了線(xiàn)程正在進(jìn)行的活動(dòng)以及在這段時(shí)間內(nèi)線(xiàn)程能完成的任務(wù)。,8.2.2 線(xiàn)程優(yōu)先級(jí),Thread類(lèi)有三個(gè)有關(guān)線(xiàn)程優(yōu)先級(jí)的靜態(tài)常量:MIN_PRIORITY,MAX_PRIORITY,NORM_PRIORITY,8.2.3 對(duì)線(xiàn)程的基本控制,結(jié)束線(xiàn)程現(xiàn)在一般采取給線(xiàn)程設(shè)定一個(gè)標(biāo)記變量的方法來(lái)決定線(xiàn)程是否應(yīng)該終止。 設(shè)定線(xiàn)程的優(yōu)先級(jí)可以使用Th

6、read對(duì)象的setPriority( int priority)方法,,線(xiàn)程 的啟動(dòng): start()暫時(shí)阻止線(xiàn)程的執(zhí)行 Thread.sleep(long millisecond )來(lái)掛起線(xiàn)程的執(zhí)行 try{Thread.sleep( 1000 );} catch( InterruptedException e ){//…. }join()方法。調(diào)用某Threa

7、d對(duì)象的join()方法,可以將一個(gè)線(xiàn)程加入到本線(xiàn)程中,本線(xiàn)程的執(zhí)行會(huì)等待另一線(xiàn)程執(zhí)行完畢。Thread t; // t是另一線(xiàn)程 try{t.join();} catch( InterruptedException e ){//…. },后臺(tái)線(xiàn)程,線(xiàn)程有兩種,一類(lèi)是Daemon線(xiàn)程,一類(lèi)是非Daemon線(xiàn)程。在Java程序中,若還有非Demon線(xiàn)程,則整個(gè)程序就不會(huì)結(jié)

8、束;當(dāng)正在運(yùn)行的線(xiàn)程都是守護(hù)線(xiàn)程時(shí),Java 虛擬機(jī)退出。使用setDaemon(true);垃圾回收是后臺(tái)線(xiàn)程示例:TestThreadDaemon.java,8.3 線(xiàn)程的同步,,多線(xiàn)程同步,線(xiàn)程都是獨(dú)立的,而且異步執(zhí)行,也就是說(shuō)每個(gè)線(xiàn)程都包含了運(yùn)行時(shí)所需要的數(shù)據(jù)或方法,而不需要外部的資源或方法,也不必關(guān)心其它線(xiàn)程的狀態(tài)或行為。但是經(jīng)常有一些同時(shí)運(yùn)行的線(xiàn)程需要共享數(shù)據(jù),例如一個(gè)線(xiàn)程向文件寫(xiě)數(shù)據(jù),而同時(shí)另一個(gè)線(xiàn)程從同一文件中讀

9、取數(shù)據(jù),因此就必須考慮其它線(xiàn)程的狀態(tài)與行為,這時(shí)就需要實(shí)現(xiàn)同步來(lái)得到預(yù)期結(jié)果。示例:SyncCounter1.java,在Java 語(yǔ)言中,引入了對(duì)象互斥鎖的概念,來(lái)保證共享數(shù)據(jù)操作的完整性。每個(gè)對(duì)象都對(duì)應(yīng)于一個(gè)可稱(chēng)為“互斥鎖”的標(biāo)記,這個(gè)標(biāo)記用來(lái)保證在任一時(shí)刻,只能有一個(gè)線(xiàn)程訪問(wèn)該對(duì)象。關(guān)鍵字synchronized 用來(lái)與對(duì)象的互斥鎖聯(lián)系。當(dāng)某個(gè)對(duì)象用synchronized修飾時(shí),表明該對(duì)象在任一時(shí)刻只能由一個(gè)線(xiàn)程訪問(wèn)。

10、使用wait()方法可以釋放對(duì)象鎖使用notify()或notifyAll()可以讓等待的一個(gè)或所有線(xiàn)程進(jìn)入就緒狀態(tài),synchronized 除了象上面講的放在對(duì)象前面限制一段代碼的執(zhí)行外,還可以放在方法聲明中,表示整個(gè)方法為同步方法。public synchronized void push(char c){…}如果synchronized用在類(lèi)聲明中,則表明該類(lèi)中的所有方法都是synchronized的。示例:S

11、yncCounter2.java,生產(chǎn)者-消費(fèi)者問(wèn)題,示例:ProducerConsumerStack.javaclass CubbyHole {private int index = 0;private int []data = new int[3];public synchronized void put(int value){while(index == data.length){try{

12、this.wait();}catch(InterruptedException e){} } data[index] = value; index++; this.notify();},public synchronized int get(){ while(index <=0){try{this.wait();}catch(InterruptedException e

13、){} }index--; int val = data[index]; this.notify(); return val;}},8.4 并行API,java.util.concurrent包Lock、ReentrantLocklock() tryLock() unlock()例:NoDeadLockDemo.javaReadWriteLock、ReentrantReadWri

14、teLock.writeLock().lock(), .readLock().unlock()例:ArrayList2.java,并行的集合類(lèi),產(chǎn)生一個(gè)線(xiàn)程安全的集合對(duì)象Collections.synchronizedArrayList(list)CopyOnWriteArrayList、 CopyOnWriteArraySet適合于很少寫(xiě)入而迭代頻繁的對(duì)象ArrayBlockingQueue生產(chǎn)者與消費(fèi)者,使用pu

溫馨提示

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

評(píng)論

0/150

提交評(píng)論