資源描述:
《2019年Java實用教程第14講Java多線程(一)課件.ppt》由會員上傳分享,免費在線閱讀,更多相關內容在教育資源-天天文庫。
1、第14講Java多線程(一)14.1Java中的線程14.2Java多線程的實現14.3線程池14.4線程的調度14.5前臺線程和后臺線程14.6本章小結(1)多進程創(chuàng)建一個進程要占用相當一部分處理器時間和內存資源,而且多數操作系統(tǒng)中進程享有獨立的內存空間,不允許進程間相互內存。所以,進程間的通信很不方便。(2)多線程線程也稱為輕型進程,因其活動在單個進程內,所以創(chuàng)建線程要比創(chuàng)建進程要廉價得多,并且允許線程間協(xié)作和數據交換,所以線程比進程更可取。但并不是所有的操作系統(tǒng)都提供對線程的支持。14.1Java中的線程線程是有生命周期的,一個線程的生命周期包含以下五種狀態(tài)(1)新建狀
2、態(tài)(New)(2)就緒狀態(tài)(Runnable)(3)運行狀態(tài)(Running)(4)阻塞狀態(tài)(Blocked)(5)死亡狀態(tài)(Dead)導致線程阻塞的原因有以下幾種:(1)通過調用sleep(milliseconds)使線程進入休眠狀態(tài),在這種情況下,線程在指定的時間內不會運行。(2)通過調用wait()使線程掛起,直到線程得到了notify()或notifyAll()消息后,線程才會進入就緒狀態(tài)。(3)線程在等待某個輸入/輸出完成。(4)線程試圖在某個對象上調用其同步控制方法,但是對象鎖不可用,因為另一個線程已經獲取了這個鎖。14.2Java多線程的實現(1)擴展Threa
3、d類Thread類是一個具體的類,該類封裝了線程的行為。要創(chuàng)建一個線程,可以使用Thread類的子類,但子類必須覆蓋Thread中的run()函數。把有用的工作放在run()函數中完成。要想啟動這個線程,必須使用子類對象調用start()函數。(2)實現Runnable接口此接口中只有一個函數,run(),此函數必須由實現了此接口的類實現。但是,就啟動這個線程而言,其語義與前一個示例稍有不同。我們可以用Runnable接14.3線程池JavaSE5對線程類庫做了大量的擴展,其中線程池就是其新特征之一。開辟一塊內存空間(線程池),里面存放了眾多(未死亡)的線程,池中線程執(zhí)行調度
4、由池管理器來處理。當有線程任務時,從池中取一個,執(zhí)行完成后線程對象歸池,這樣可以避免反復創(chuàng)建線程對象所帶來的性能開銷,節(jié)省系統(tǒng)的資源。Java5的線程池分為固定尺寸的線程池、可變尺寸連接池和單任務線程池等。14.3.1固定尺寸線程池可以采用Executors類中的靜態(tài)方法newFixedThreadPool(intnThreads)方法創(chuàng)建一個固定尺寸大小的線程池。ExecutorServiceexec=Executors.newFixedThreadPool(2);14.3.2可變尺寸線程池可以使用Executors.newCachedThreadPool()根據需要創(chuàng)建一
5、個線程池。importjava.util.concurrent.*;publicclassCachedThreadPoolDemo{publicstaticvoidmain(String[]args){ExecutorServiceexec=Executors.newCachedThreadPool();for(inti=0;i<10;i++)exec.execute(newMyRunnable(i));exec.shutdown();}}14.3.3單任務線程池可以使用Executors.newSingleThreadExecutor()創(chuàng)建一個單任務線程池。importj
6、ava.util.concurrent.*;publicclassSingleThreadPoolDemo{publicstaticvoidmain(String[]args){ExecutorServiceexec=Executors.newSingleThreadExecutor();for(inti=0;i<10;i++)exec.execute(newMyRunnable(i));exec.shutdown();}}14.4線程的調度Java虛擬機采用搶占式調度模型,盡量優(yōu)先讓就緒隊列中優(yōu)先級高的線程占用CPU,如果可運行池中的線程優(yōu)先級相同,那么就隨機選擇一個線程,
7、使其占用CPU。處于運行狀態(tài)的線程會一直運行,直至它不得不放棄CPU。一個線程放棄CPU的原因有以下幾個方面:(1)Java虛擬機讓當前線程暫時放棄CPU,轉到就緒狀態(tài),使其它線程獲得運行機會;(2)當前線程因為某些原因而進入阻塞狀態(tài);(3)線程結束運行。線程的調度不是跨平臺的,它不僅僅取決于Java虛擬機,還依賴于操作系統(tǒng)。Java的線程調度是不分時的,同時啟動多個線程后,不能保證各個線程輪流獲得均等的CPU時間片。Java線程調度是Java多線程的核心,調度只能最大限度的影響線程執(zhí)行的次序,而不能做