

版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 再談使用網(wǎng)絡(luò)-唐大仕出版物、相關(guān)資料下載
- 計(jì)算機(jī)應(yīng)用基礎(chǔ)-唐大仕出版物、相關(guān)資料下載
- java語(yǔ)言面與向?qū)ο蟮某绦蛟O(shè)計(jì) - 唐大仕出版物、相關(guān)資料下載
- 例3-1求解一元二次方程-唐大仕出版物、相關(guān)資料
- 基于java的多線(xiàn)程下載工具的實(shí)現(xiàn)
- 基于JAVA的多線(xiàn)程下載工具的實(shí)現(xiàn).doc
- 第1章java語(yǔ)言與面向?qū)ο蟮某绦蛟O(shè)計(jì)-唐大仕
- java多線(xiàn)程編程詳解
- java多線(xiàn)程,集合框架(附簡(jiǎn)單代碼)
- 出版物的形態(tài)
- java多線(xiàn)程與線(xiàn)程安全實(shí)踐-基于http協(xié)議的斷點(diǎn)續(xù)傳
- AOP在JAVA多線(xiàn)程監(jiān)控中的應(yīng)用.pdf
- Java多線(xiàn)程調(diào)試工具的研究與開(kāi)發(fā).pdf
- 基于JAVA的多線(xiàn)程下載工具的實(shí)現(xiàn)畢業(yè)設(shè)計(jì)任務(wù)書(shū).doc
- 第1講-出版物的起源和發(fā)展
- 出版物選題策劃
- 內(nèi)部資料性出版物管理辦法
- 第七章出版物市場(chǎng)及其需求
- 內(nèi)部資料性出版物管理辦法
- 出版物中常見(jiàn)的別字
評(píng)論
0/150
提交評(píng)論