




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第十四章線程線程學習目標學習目標 了解進程與線程的概念。 了解線程在其生命周期中狀態(tài)的轉換。 能夠熟練的創(chuàng)建線程,靈活地運用線程寫出反應靈敏的程序。 理解線程同步的概念,并熟練運用。范例導入范例導入 Java語言的一大特性就是對線程的支持。多線程就是指一個程序有多個執(zhí)行點,按幾條不同的執(zhí)行線索共同工作的情況,它使得編程人員可以很方便地開發(fā)出具有多線程功能、能同時處理多個任務的功能強大的應用程序。為了建立這些線程正在同時執(zhí)行的感覺,Java快速地把控制從一個線程切換到另一個線程。本單元的內容主要就是講述Java中線程的創(chuàng)建與使用。線程和進程的概念線程和進程的概念 進程是一種在自身定址空間中執(zhí)行的
2、相對獨立的程序。 線程則是進程中的一個“單一連續(xù)控制的語句流。 線程的狀態(tài)及其生命周期線程的狀態(tài)及其生命周期線程的優(yōu)先級線程的優(yōu)先級 在Java中,每個線程都有一個優(yōu)先級。在默認條件下,一個線程將繼承其父線程的優(yōu)先級。我們可以使用setPriority方法來提高或者降低線程的優(yōu)先級,可以將線程的優(yōu)先級設置為1-10之間的某個數字,或者設置成Thread類中的三個靜態(tài)常量之一。public static final int MAX_PRIORITYpublic static final int MIN_PRIORITYpublic static final int NORM_PRIORITY線程
3、的創(chuàng)建線程的創(chuàng)建 Java中創(chuàng)建線程有兩種常用方法,涉及到java.lang包中的一個類和一個接口,它們是Thread類和Runnable接口。(1)Runnable接口定義線程的行為。(2)Thread類定義線程的生命周期。范例解析范例解析使用Thread創(chuàng)建線程:public MyThread extends Thread public void run() for (int i=0; i20; i+) System.out.println( “my Thread i value: ”+i); 范例解析范例解析使用Runnable創(chuàng)建線程:public MyThread implement
4、s Runnable public void run() for (int i=0; i20; i+) System.out.println( “my Thread i value: ”+i); 綜合練習綜合練習 練習:使用AWT和線程完成一個測試打字速度的程序。ThreadThread類類 - 1 - 1構造方法:public Thread()public Thread(String name)public Thread(Runnable target)public Thread(Runnable target,String name)public Thread(ThreadGroup gr
5、oup,Runnable target)public Thread(ThreadGroup group,Runnable target,String name)ThreadThread類類 - 2 - 2成員方法:public void start()public static void sleep(long millis)throws InterruptedExceptionpublic static void sleep(long millis,int nanos)throws InterruptedExceptionpublic final void join()throws Inter
6、ruptedExceptionpublic final void join(long millis)throws InterruptedExceptionThreadThread類類 - 3 - 3成員方法:public final void join(long millis,int nanos) throws InterruptedExceptionpublic final void suspend()public final void resume()public static void yield()public final void stop()public String toStri
7、ng()ThreadThread類類 - 4 - 4成員方法:public final ThreadGroup getThreadGroup()public static Thread currentThread()public final String getName()public final void setName(String name)public final boolean isDaemon()public final void setDaemon(boolean on)public final boolean isAlive()ThreadThread類類 - 5 - 5成員方
8、法:public static int activeCount()public void interrupt()public boolean isInterrupted()public static boolean interrupted() 練習:使用Thread和Runable完成多線程的測試。ThreadGroupThreadGroup類類 - 1 - 1 為便于線程的管理,Java將多個線程集成到一個線程組,每個線程都是線程組中的一個成員。通過線程組可以同時對其中的多個線程進行某個操作如:啟動、中斷等。如果一個線程在構造時沒有指定隸屬于哪個線程組,Java默認為它與創(chuàng)建它的線程屬于同一
9、個線程組。ThreadGroupThreadGroup類類 - 2 - 2構造方法:public ThreadGroup(String name)public ThreadGroup(ThreadGroup parent,String name)成員方法:public int activeCount()public final String getName()public final ThreadGroup getParent()ThreadGroupThreadGroup類類 - 3 - 3成員方法:public final void suspend()public final void r
10、esume()public final void stop() 練習:測試線程組的相關方法。線程的同步線程的同步 - 1 - 1 線程同步就是為了避免多個線程同時訪問一個共享對象。 首先來看一下當多個線程訪問共享 資源時不進行線程同步會發(fā)生什么問題。 練習:定義一個Warehouse類,包括庫存量以及入庫、出庫行為;定義一個Consumer線程類,每次從Warehouse中消費掉1個商品,共50次;定義一個Producer線程類,每次生產1個商品存入Warehouse中;定義Factory類分別創(chuàng)建三個類的對象并啟動觀察。線程的同步線程的同步 - 2 - 2 線程同步中與對象同步鎖相關的方法,
11、在Object類中定義如下:public final void wait()throws InterruptedExceptionpublic final void wait(long timeout)throws InterruptedExceptionpublic final void wait(long timeout,int nanos)throws InterruptedExceptionpublic final void notify()public final void notifyAll()線程的同步線程的同步 - 3 - 3 線程同步的實現方式主要有兩種: (1)同步方法。
12、(2)同步塊。 練習:將上面的“生產者-消費者”問題改為“同步方法”實現,并觀察執(zhí)行結果。線程的同步線程的同步 - 4 - 4語法: synchronized( 要鎖定的數據對象 ) 對共享資源的訪問行為; 練習:使用“同步塊”方式更改上面“生產者-消費者練習。線程的同步線程的同步 - 5 - 5常見的上鎖問題: 讓所有的線程按照同樣的順序獲得一組鎖。這種方法消除了 X 和 Y 的擁有者分別等待對方的資源的問題。 將多個鎖組成一組并放到同一個鎖下。前面死鎖的例子中,可以創(chuàng)建一個銀器對象的鎖。于是在獲得刀或叉之前都必須獲得這個銀器的鎖線程的同步線程的同步 - 6 - 6 將那些不會阻塞的可獲得資
13、源用變量標志出來。當某個線程獲得銀器對象的鎖時,就可以通過檢查變量來判斷是否整個銀器集合中的對象鎖都可獲得。如果是,它就可以獲得相關的鎖,否則,就要釋放掉銀器這個鎖并稍后再嘗試。 最重要的是,在編寫代碼前認真仔細地設計整個系統。多線程是困難的,在開始編程之前詳細設計系統能夠幫助你避免難以發(fā)現死鎖的問題。ThreadLocalThreadLocal類類 - 1 - 1 ThreadLocal并非是一個線程的本地實現版本,它是Thread local variable。 線程局部變量(ThreadLocal)其實的功用非常簡單,就是為每一個使用該變量的線程都提供一個變量值的副本,是每一個線程都可以
14、獨立地改變自己的副本,而不會和其它線程的副本沖突。從線程的角度看,就好像每一個線程都完全擁有該變量。ThreadLocalThreadLocal類類 - 2 - 2 ThreadLocal 對象通常是類中的 private static 字段,它們希望將狀態(tài)與某一個線程(例如,用戶 ID 或事務 ID)相關聯。 在線程是活動的并且ThreadLocal對象是可訪問的時,該線程就持有一個到該線程局部變量副本的隱含引用,當該線程運行結束后,該線程擁有的所有線程局部變量的副本都將失效,并等待垃圾收集器收集。ThreadLocalThreadLocal類類 - 3 - 3構造方法:public Thr
15、eadLocal()成員方法:protected T initialValue()public void remove()public T get()public void set(T value)ThreadLocalThreadLocal類類 - 4 - 4 例如:官方API中有如下程序能夠生成對每個線程唯一的局部標識符。線程ID是在第一次調用時分配,在后續(xù)調用中不會更改。 import java.util.concurrent.atomic.AtomicInteger;public class UniqueThreadIdGenerator private static final At
16、omicInteger uniqueId = new AtomicInteger(0); private static final ThreadLocal ThreadLocalThreadLocal類類 - 5 - 5uniqueNum = new ThreadLocal () initialValue() return uniqueId.getAndIncrement(); public static int getCurrentThreadId() return uniqueId.get(); 新的線程包新的線程包 在JDK 5里加入了三個與多線程相關的包,它們是: (1)java.ut
17、il.concurrent包:包含了常用的多線程工具,是新的多線程工具的主體。 (2)java.util.concurrent.atomic包:包含了不用加鎖情況下就能改變值的原子變量。 (3)java.util.concurrent.locks包:包含鎖定的工具。CallableCallable接口接口 Callable是類似于Runnable的接口,實現Callable接口的類和實現Runnable的類都是可被線程執(zhí)行的任務,只是Callable包含的是call()方法,帶返回值并可拋異常。成員方法:public V call() throws ExceptionFutureFuture接
18、口接口成員方法:public boolean cancel(boolean mayInterruptIfRunning)public boolean isCancelled()public boolean isDone()public V get() throws InterruptedException,ExecutionExceptionpublic V get(long timeout,TimeUnit unit) throws InterruptedException, ExecutionException,TimeoutExceptionFutureTaskFutureTask類類
19、- 1- 1 Java提供FutureTask類主要目的簡化我們的操作,該類實現了Future和Runnable接口,并且Future接口和Runnable接口的方法都有默認實現,不需要用戶實現。從而大幅簡化了用戶的繁瑣開發(fā)過程。 對于用戶來說,只需要把要運行的代碼類實現Callable接口,然后把該類通過FutureTask類封裝一下,就可以異步運行了。FutureTaskFutureTask類類 - 2- 2構造方法:public FutureTask(Callable callable)public FutureTask(Runnable runnable,V result) 練習:使用
20、新的線程架構中的API完成線程測試。新任務執(zhí)行架構新任務執(zhí)行架構ExecutorExecutor接口接口 Executor接口代表:執(zhí)行器,用于執(zhí)行Rannable任務的。成員方法:public void execute(Runnable command)ExecutorServiceExecutorService接口接口 - 1 - 1 ExecutorService繼承了Executor接口,并提供了執(zhí)行和中止Callable任務的服務。成員方法:public Future submit(Runnable task)public Future submit(Callable task)pu
21、blic Future submit(Runnable task,T result)ExecutorServiceExecutorService接口接口 - 2 - 2成員方法:public void shutdown()public List shutdownNow()public boolean isShutdown()public boolean isTerminated()public ListFuture invokeAll(CollectionCallable tasks) throws InterruptedExceptionExecutorServiceExecutorServ
22、ice接口接口 - 3 - 3成員方法:public ListFuture invokeAll(CollectionCallable tasks, long timeout,TimeUnit unit)throws InterruptedExceptionpublic T invokeAny(CollectionCallable tasks) throws InterruptedException, ExecutionExceptionExecutorServiceExecutorService接口接口 - 4 - 4成員方法:public T invokeAny(CollectionCall
23、able tasks, long timeout, TimeUnit unit)throws InterruptedException, ExecutionException,TimeoutException 其它方法參照API文檔。ExecutorsExecutors類類 - 1 - 1 在JDK 5建議使用Executors的工具類來得到Executor接口的具體對象,需要注意的是Executors是一個類,不是Executor的復數形式。成員方法:public static Callable callable(Runnable task)public static Callable ca
24、llable(Runnable task,T result)ExecutorsExecutors類類 - 2 - 2成員方法:public static ExecutorService newSingleThreadExecutor()public static ExecutorService newSingleThreadExecutor( ThreadFactory threadFactory)public static ExecutorService newCachedThreadPool()ExecutorsExecutors類類 - 3 - 3成員方法:public static E
25、xecutorService newCachedThreadPool( ThreadFactory threadFactory)public static ExecutorService newFixedThreadPool(int nThreads)public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory)ExecutorsExecutors類類 - 4 - 4成員方法:public static ScheduledExecutorService newSingleTh
26、readScheduledExecutor()public static ScheduledExecutorService newSingleThreadScheduledExecutor( ThreadFactory threadFactory)public static ScheduledExecutorService newScheduledThreadPool( int corePoolSize)ExecutorsExecutors類類 - 5 - 5成員方法:public static ScheduledExecutorService newScheduledThreadPool(
27、int corePoolSize,ThreadFactory threadFactory) 其它方法參照API文檔。 練習:將前面做過的練習,擴展為多線程練習。新架構中的線程鎖新架構中的線程鎖 在JDK 5里出現一種新的鎖定方式,我們可以將其稱為:顯式鎖和條件對象,相關的接口定義在java.util.concurrent.locks 子包中。LockLock接口接口 - 1 - 1 Lock接口實現提供了比使用 synchronized 方法和語句可獲得的更廣泛的鎖定操作。此實現允許更靈活的結構,可以具有差別很大的屬性,可以支持多個相關的 Condition 對象。成員方法:public vo
28、id lock() public void lockInterruptibly()throws InterruptedExceptionpublic Condition newCondition() LockLock接口接口 - 2 - 2成員方法:public boolean tryLock() public boolean tryLock(long time, TimeUnit unit) throws InterruptedExceptionpublic void unlock() ConditionCondition接口接口 - 1 - 1 有時候線程取得lock后需要在一定條件下才能做某些工作,比如說經典的Producer和Consumer問題,Consumer必須在倉庫有商品的時候才能消費商品,否則它必須暫時放棄對倉庫的鎖定,等到Producer往倉庫里放了商品后再去消費。而Producer必須等到倉庫空了才能往里放商品,否則它需要暫時解鎖等Consumer把商品消費掉才能往倉庫里放商品。在JDK 5以前,這種功能是由Object類的wait(), notify()和notifyAll()等方法實現的,在JDK 5里面,這些功能集中到了Condition這個接口來實現。Con
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 貨物運輸代理授權委托合同
- VR技術在教育培訓行業(yè)的創(chuàng)新應用
- 客戶往來商務信函管理規(guī)范
- 《歷史經典著作〈紅樓夢〉閱讀教學設計》
- 產品采購及供應協議規(guī)范內容
- 高考語文復習微專題之文言文閱讀之斷句
- 高考語文復習:文言文專題訓練《莊子》
- 人才培訓與招聘服務協議
- 中小學必讀經典書目征文
- 古詩詞中情感與意象的探討
- 追悼會主持詞開場白-追悼會流程主持詞
- Unit7ArtLesson2BeijingOpera課件高中英語北師版
- 人教版七年級數學下冊 第五章 相交線與平行線5.4 平移(課件)
- 數學之美:欣賞數學的優(yōu)雅與美麗
- 2023高考語文文言文復習:《說苑》練習題(含答案解析)
- 成都印鈔公司招聘考試題
- 低血糖健康宣教
- 跨文化商務交際導論-教學課件Unit 2 Intercultural business communication
- 《射頻同軸電纜》課件2
- 餐飲經營分析會報告
- 口腔頜面部感染患者的營養(yǎng)狀況及輔助營養(yǎng)治療策略
評論
0/150
提交評論