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