Thread线程
多線程
● 并行:指兩個或多個事件在同一時刻發(fā)生(同時發(fā)生)。
● 并發(fā):指兩個或多個事件在同一個時間段內(nèi)發(fā)生。
線程與進程
● 進程:是指一個內(nèi)存中運行的應(yīng)用程序,每個進程都有一個獨立的內(nèi)存空間,一個應(yīng)用程序可以同時運行多個進程;進程也是程序的一次執(zhí)行過程,是系統(tǒng)運行程序的基本單位;系統(tǒng)運行一個程序即是一個進程從創(chuàng)建、運行到消亡的過程。就是.exe文件,一個應(yīng)用程序可以有多個進程,每個進程都有一個獨立的內(nèi)存空間
一個進程可以看出一個單核cpu,而我們的java程序就是一個進程,所以我們接下來線程的多線程,就是多線程并發(fā)
● 線程:進程內(nèi)部的一個獨立執(zhí)行單元;一個進程可以同時并發(fā)的運行多個線程,可以理解為一個進程便相當于一個單 CPU 操作系統(tǒng),而線程便是這個系統(tǒng)中運行的多個任務(wù)。
進程與線程的區(qū)別:
● 進程:有獨立的內(nèi)存空間,進程中的數(shù)據(jù)存放空間(堆空間和棧空間)是獨立的,至少有一個線程。● 線程:堆空間是共享的,棧空間是獨立的,線程消耗的資源比進程小的多。線程調(diào)度:
計算機通常只有一個CPU時,在任意時刻只能執(zhí)行一條計算機指令,每一個進程只有獲得CPU的使用權(quán)才能執(zhí)行指令。所謂多進程并發(fā)運行,從宏觀上看,其實是各個進程輪流獲得CPU的使用權(quán),分別執(zhí)行各自的任務(wù)。那么,在可運行池中,會有多個線程處于就緒狀態(tài)等到CPU, JVM 就負責了線程的調(diào)度。JVM采用的是搶占式調(diào)度,沒有采用分時調(diào)度,因此可以能造成多線程執(zhí)行結(jié)果的的隨機性。
java.lang.Thread類,API中該類中定義了有關(guān)線程的一些方法,具體如下:
構(gòu)造方法:
常用方法:
● public String getName():獲取當前線程名稱。● public static Thread currentThread():返回對當前正在執(zhí)行的線程對象的引用。● public void start():導致此線程開始執(zhí)行; Java虛擬機調(diào)用此線程的run方法。● public void run():此線程要執(zhí)行的任務(wù)在此處定義代碼。● public static void sleep(long millis):使當前正在執(zhí)行的線程以指定的毫秒數(shù)暫停(暫時停止執(zhí)行)實現(xiàn)Runnable接口比繼承Thread類所具有的優(yōu)勢:
線程安全
線程安全問題都是由全局變量及靜態(tài)變量引起的。若每個線程中對全局變量、靜態(tài)變量只有讀操作,而無寫操作,一般來說,這個全局變量是線程安全的;若有多個線程同時執(zhí)行寫操作,一般都需要考慮線程同步,否則的話就可能影響線程安全。
線程同步
有三種方式完成同步操作: 1. 同步代碼塊。 同步代碼塊:synchronized關(guān)鍵字可以用于方法中的某個區(qū)塊中,表示只對這個區(qū)塊的資源實行互斥訪問。 ```java synchronized (同步鎖) { } ```同步方法:使用synchronized修飾的方法,就叫做同步方法,保證A線程執(zhí)行該方法的時候,其他線程只能在方法外等著。
同步鎖:
同步鎖是誰?
對于非static方法,同步鎖就是this。
對于static方法,我們使用當前方法所在類的字節(jié)碼對象(類名.class)。
對象的同步鎖只是一個概念,可以想象為在對象上標記了一個鎖.
| NEW(新建) | 線程剛被創(chuàng)建,但是并未啟動。還沒調(diào)用start方法。 |
| Runnable(可運行) | 線程可以在java虛擬機中運行的狀態(tài),可能正在運行自己代碼,也可能沒有,這取決于操作系統(tǒng)處理器。 |
| Blocked(鎖阻塞) | 當一個線程試圖獲取一個對象鎖,而該對象鎖被其他的線程持有,則該線程進入Blocked狀態(tài);當該線程持有鎖時,該線程將變成Runnable狀態(tài)。 |
| Waiting(無限等待) | 一個線程在等待另一個線程執(zhí)行一個(喚醒)動作時,該線程進入Waiting狀態(tài)。通過wait()方法進入這個狀態(tài)后是不能自動喚醒的,必須等待另一個線程調(diào)用notify或者notifyAll方法才能夠喚醒。 |
| Timed Waiting(計時等待) | 同waiting狀態(tài),有幾個方法有超時參數(shù),調(diào)用他們將進入Timed Waiting狀態(tài)。這一狀態(tài)將一直保持到超時期滿或者接收到喚醒通知。帶有超時參數(shù)的常用方法有Thread.sleep 、Object.wait。 |
| Teminated(被終止) | 因為run方法正常退出而死亡,或者因為沒有捕獲的異常終止了run方法而死亡。 |
線程池概念
線程池:其實就是一個容納多個線程的容器,其中的線程可以反復使用,省去了頻繁創(chuàng)建線程對象的操作,無需反復創(chuàng)建線程而消耗過多資源。合理利用線程池能夠帶來三個好處:
Executors類中有個創(chuàng)建線程池的方法如下:
public static ExecutorService newFixedThreadPool(int nThreads)eg:ExecutorService esc = Executors.newFixedThreadPool(2);返回線程池對象。(創(chuàng)建的是有界線程池,也就是池中的線程個數(shù)可以指定最大數(shù)量)
獲取到了一個線程池ExecutorService 對象,那么怎么使用呢,在這里定義了一個使用線程池對象的方法如下:
Future接口:用來記錄線程任務(wù)執(zhí)行完畢后產(chǎn)生的結(jié)果。線程池創(chuàng)建與使用。
總結(jié)
- 上一篇: 【Collection、泛型】
- 下一篇: 端午安康!