java多線程,先要知道什麼是線程(Threads),爲何要使用多線程。
線程,有時被稱爲輕量級進程(Lightweight Process,LWP),是程序執行流的最小單元。線程是進程(稍後說明一下什麼是進程)中的一個實體,是被系統獨立調度和分派的基本單位。一個標準的線程由線程ID,當前指令指針(PC),寄存器集合和堆棧組成。因爲線程之間的相互制約,導致線程在運行中呈現出間斷性。線程也有就緒、阻塞和運行三種基本狀態。
在單個程序中同時運行多個線程完成不一樣的工做,稱爲多線程。java
什麼是進程,進程和線程的區別。
進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操做系統結構的基礎。
與進程相對應,線程與資源分配無關,它屬於某一個進程,並與進程內的其餘線程一塊兒共享進程的資源,一般在一個進程中能夠包含若干個線程,它們能夠利用進程所擁有的資源。
在引入線程的操做系統中,一般都是把進程做爲分配資源的基本單位,而把線程做爲獨立運行和獨立調度的基本單位。因爲線程比進程更小,基本上不擁有系統資源,故對它的調度所付出的開銷就會小得多,能更高效的提升系統內多個程序間併發執行的程度,從而顯著提升系統資源的利用率和吞吐量。多線程
爲何要使用多線程,使用多線程的優點是哪些。
首先就是線程開銷小,切換快,其次可併發執行多任務,達到異步處理,更能有效的利用cpu性能。再者全部線程都具備相同的地址空間(進程的地址空間),因此能夠共享該進程所擁有的資源。併發
接下來就要知道線程的生命週期及五種基本狀態。如圖:
Java線程具備五中基本狀態
新建狀態(New):當線程對象對建立後,即進入了新建狀態,如:Thread t = new MyThread();異步
就緒狀態(Runnable):當調用線程對象的start()方法(t.start();),線程即進入就緒狀態。處於就緒狀態的線程,只是說明此線程已經作好了準備,隨時等待CPU調度執行,並非說執行了t.start()此線程當即就會執行;性能
運行狀態(Running):當CPU開始調度處於就緒狀態的線程時,此時線程才得以真正執行,即進入到運行狀態。注:就 緒狀態是進入到運行狀態的惟一入口,也就是說,線程要想進入運行狀態執行,首先必須處於就緒狀態中;spa
阻塞狀態(Blocked):處於運行狀態中的線程因爲某種緣由,暫時放棄對CPU的使用權,中止執行,此時進入阻塞狀態,直到其進入到就緒狀態,才 有機會再次被CPU調用以進入到運行狀態。根據阻塞產生的緣由不一樣,阻塞狀態又能夠分爲三種:操作系統
1.等待阻塞:運行狀態中的線程執行wait()方法,使本線程進入到等待阻塞狀態;線程
2.同步阻塞 -- 線程在獲取synchronized同步鎖失敗(由於鎖被其它線程所佔用),它會進入同步阻塞狀態;指針
3.其餘阻塞 -- 經過調用線程的sleep()或join()或發出了I/O請求時,線程會進入到阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程從新轉入就緒狀態。code
死亡狀態(Dead):線程執行完了或者因異常退出了run()方法,該線程結束生命週期。