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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

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

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

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

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

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

11、yncCounter2.java,生產(chǎn)者-消費(fèi)者問題,示例: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,并行的集合類,產(chǎn)生一個(gè)線程安全的集合對(duì)象Collections.synchronizedArrayList(list)CopyOnWriteArrayList、 CopyOnWriteArraySet適合于很少寫入而迭代頻繁的對(duì)象ArrayBlockingQueue生產(chǎn)者與消費(fèi)者,使用pu

溫馨提示

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

評(píng)論

0/150

提交評(píng)論