版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Java程序設計,第8章 多線程,8.1 線程及其創(chuàng)建8.1.1 Java中的線程,Java程序通過流控制來執(zhí)行程序流,程序中單個順序的流控制稱為線程,多線程則指的是在單個程序中可以同時運行多個不同的線程執(zhí)行不同的任務。 單個程序內部也可以在同一時刻進行多種運算。很多程序語言需要利用外部的線程軟件包來實現多線程,而Java則內在支持多線程,它的所有類都是在多線程的思想下定義的。,線程,線程就是程序中單獨順序的流控制。Jav
2、a的線程是通過Java的軟件包java.lang中定義的類Thread來實現的。,線程體,線程的所有活動都是通過線程體---- run()方法來實現的。在一個線程被建立并初始化以后,Java的運行時系統(tǒng)就自動調用run()方法。正是通過run()方法才使得建立線程的目的得以實現。通常,run()方法是一個循環(huán),例如一個播放動畫的線程要循環(huán)顯示一系列圖片。有時,run()方法會執(zhí)行一個時間較長的操作,例如下載并播放一個JPEG格式
3、的電影。,8.1.2 創(chuàng)建線程對象的兩種方法,1.通過繼承Thread類創(chuàng)建線程class MyThread extends Thread {public void run() {for(int i=0;i<100;i++) {System.out.print (" " + i);}}2.通過向Thread()構造方法傳遞Runnable對象來創(chuàng)建線程class MyTask
4、 implements Runnable {public void run() { …}}Thread thread = new Thread(mytask);thread.start();3. 可用匿名類來實現Runnable,如TestThread4Anonymous.java,8.1.3 多線程,TestThread3.java 多線程。 ThreadDraw.java 多線程繪圖。,8.2 線程的控制,,8.2
5、.1 線程的狀態(tài)與生命周期,在一個線程的生命周期中,它總處于某一種狀態(tài)中。線程的狀態(tài)表示了線程正在進行的活動以及在這段時間內線程能完成的任務。,8.2.2 線程優(yōu)先級,Thread類有三個有關線程優(yōu)先級的靜態(tài)常量:MIN_PRIORITY,MAX_PRIORITY,NORM_PRIORITY,8.2.3 對線程的基本控制,結束線程現在一般采取給線程設定一個標記變量的方法來決定線程是否應該終止。 設定線程的優(yōu)先級可以使用Th
6、read對象的setPriority( int priority)方法,,線程 的啟動: start()暫時阻止線程的執(zhí)行 Thread.sleep(long millisecond )來掛起線程的執(zhí)行 try{Thread.sleep( 1000 );} catch( InterruptedException e ){//…. }join()方法。調用某Threa
7、d對象的join()方法,可以將一個線程加入到本線程中,本線程的執(zhí)行會等待另一線程執(zhí)行完畢。Thread t; // t是另一線程 try{t.join();} catch( InterruptedException e ){//…. },后臺線程,線程有兩種,一類是Daemon線程,一類是非Daemon線程。在Java程序中,若還有非Demon線程,則整個程序就不會結
8、束;當正在運行的線程都是守護線程時,Java 虛擬機退出。使用setDaemon(true);垃圾回收是后臺線程示例:TestThreadDaemon.java,8.3 線程的同步,,多線程同步,線程都是獨立的,而且異步執(zhí)行,也就是說每個線程都包含了運行時所需要的數據或方法,而不需要外部的資源或方法,也不必關心其它線程的狀態(tài)或行為。但是經常有一些同時運行的線程需要共享數據,例如一個線程向文件寫數據,而同時另一個線程從同一文件中讀
9、取數據,因此就必須考慮其它線程的狀態(tài)與行為,這時就需要實現同步來得到預期結果。示例:SyncCounter1.java,在Java 語言中,引入了對象互斥鎖的概念,來保證共享數據操作的完整性。每個對象都對應于一個可稱為“互斥鎖”的標記,這個標記用來保證在任一時刻,只能有一個線程訪問該對象。關鍵字synchronized 用來與對象的互斥鎖聯系。當某個對象用synchronized修飾時,表明該對象在任一時刻只能由一個線程訪問。
10、使用wait()方法可以釋放對象鎖使用notify()或notifyAll()可以讓等待的一個或所有線程進入就緒狀態(tài),synchronized 除了象上面講的放在對象前面限制一段代碼的執(zhí)行外,還可以放在方法聲明中,表示整個方法為同步方法。public synchronized void push(char c){…}如果synchronized用在類聲明中,則表明該類中的所有方法都是synchronized的。示例:S
11、yncCounter2.java,生產者-消費者問題,示例: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,并行的集合類,產生一個線程安全的集合對象Collections.synchronizedArrayList(list)CopyOnWriteArrayList、 CopyOnWriteArraySet適合于很少寫入而迭代頻繁的對象ArrayBlockingQueue生產者與消費者,使用pu
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 再談使用網絡-唐大仕出版物、相關資料下載
- 計算機應用基礎-唐大仕出版物、相關資料下載
- java語言面與向對象的程序設計 - 唐大仕出版物、相關資料下載
- 例3-1求解一元二次方程-唐大仕出版物、相關資料
- 基于java的多線程下載工具的實現
- 基于JAVA的多線程下載工具的實現.doc
- 第1章java語言與面向對象的程序設計-唐大仕
- java多線程編程詳解
- java多線程,集合框架(附簡單代碼)
- 出版物的形態(tài)
- java多線程與線程安全實踐-基于http協議的斷點續(xù)傳
- AOP在JAVA多線程監(jiān)控中的應用.pdf
- Java多線程調試工具的研究與開發(fā).pdf
- 基于JAVA的多線程下載工具的實現畢業(yè)設計任務書.doc
- 第1講-出版物的起源和發(fā)展
- 出版物選題策劃
- 內部資料性出版物管理辦法
- 第七章出版物市場及其需求
- 內部資料性出版物管理辦法
- 出版物中常見的別字
評論
0/150
提交評論