Java线程详解(1)-概念与原理
一、進程與線程
? ? ? ? 進程是指一個內存中運行的應用程序,每個進程都有自己獨立的一塊內存空間,即進程空間或(虛空間)。進程不依賴于線程而獨立存在,一個進程中可以啟動多個線程。比如在Windows系統中,一個運行的exe就是一個進程。
????????線程是指進程中的一個執行流程,一個進程中可以運行多個線程。比如java.exe進程中可以運行很多線程。線程總是屬于某個進程,線程沒有自己的虛擬地址空間,與進程內的其他線程一起共享分配給該進程的所有資源。
????????“同時”執行是人的感覺,在線程之間實際上輪換執行。
????????進程在執行過程中擁有獨立的內存單元,進程有獨立的地址空間,而多個線程共享內存,從而極大地提高了程序的運行效率。
????????線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
????????進程是具有一定獨立功能的程序關于某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位。
????????線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源。
????????線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程包含以下內容:
- ?一個指向當前被執行指令的指令指針;
- 一個棧;
- 一個寄存器值的集合,定義了一部分描述正在執行線程的處理器狀態的值
- 一個私有的數據區。
????????我們使用Join()方法掛起當前線程,直到調用Join()方法的線程執行完畢。該方法還存在包含參數的重載版本,其中的參數用于指定等待線程結束的最長時間(即超時)所花費的毫秒數。如果線程中的工作在規定的超時時段內結束,該版本的Join()方法將返回一個布爾量True。
????????簡而言之:
- 一個程序至少有一個進程,一個進程至少有一個線程。
- 線程的劃分尺度小于進程,使得多進程程序的并發性高。
- 另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。
- 線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
- 從邏輯角度來看,多線程的意義在于一個應用程序中,有多個執行部分可以同時執行。但操作系統并沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。
????????在Java中,每次程序運行至少啟動2個線程:一個是main線程,一個是垃圾收集線程。因為每當使用java命令執行一個類的時候,實際上都會啟動一個JVM,每一個JVM實際上就是在操作系統中啟動了一個進程。
二、Java中的線程
? ? ? ? 在Java中,“線程”指兩件不同的事情:
????????1、java.lang.Thread類的一個實例;
????????2、線程的執行。
????????在 Java程序中,有兩種方法創建線程:
????????一是對 Thread 類進行派生并覆蓋 run方法;
????????二是通過實現Runnable接口創建。
????????使用java.lang.Thread類或者java.lang.Runnable接口編寫代碼來定義、實例化和啟動新線程。
????????一個Thread類實例只是一個對象,像Java中的任何其他對象一樣,具有變量和方法,生死于堆上。
????????Java中,每個線程都有一個調用棧,即使不在程序中創建任何新的線程,線程也在后臺運行著。
????????一個Java應用總是從main()方法開始運行,main()方法運行在一個線程內,他被稱為主線程。
????????一旦創建一個新的線程,就產生一個新的調用棧。
????????線程總體分兩類:用戶線程和守候線程。
????????當所有用戶線程執行完畢的時候,JVM自動關閉。但是守候線程卻不獨立于JVM,守候線程一般是由操作系統或者用戶自己創建的。
?
總結
以上是生活随笔為你收集整理的Java线程详解(1)-概念与原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 2.7版本与3.6的不同
- 下一篇: Java线程详解(2)-创建与启动