進程是一個實體。每個進程都有它本身的地址空間,java
文本區域存儲處理器執行的代碼;數據區域存儲變量和進程執行期間使用的動態分配的內存;堆棧區域存儲着活動過程調用的指令和本地變量。程序員
進程是一個「執行中的程序」。程序是一個沒有生命的實體,只有處理器賦予程序生命時(操做系統執行之),它才能成爲一個活動的實體,咱們稱其爲進程。golang
線程,是程序執行流的最小單元。一個標準的線程多線程
線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程本身不擁有系統資源,只擁有一點兒在運行中必不可少的資源,但它可與同屬一個 進程的其它線程共享進程所擁有的所有資源。一個線程能夠建立和撤消另外一個線程,同一進程中的多個線程之間能夠併發執行。因爲線程之間的相互制約,導致線程 在運行中呈現出間斷性。併發
線程的狀態機spa
線程也有就緒、阻塞和運行三種基本狀態。就緒狀態是指線程具有運行的全部條件,邏輯上能夠運行,在等待處理機;運行狀態是指線程佔有處理機正在運行;阻塞狀態是指線程在等待一個事件(如某個信號量),邏輯上不可執行。每個程序都至少有一個線程,若程序只有一個線程,那就是程序自己。
線程是程序中一個單一的順序控制流程。進程內一個相對獨立的、可調度的執行單元,是系統獨立調度和分派CPU的基本單位指運行中的程序的調度單位。在單個程序中同時運行多個線程完成不一樣的工做,稱爲多線程。操作系統
線程是程序中一個單一的順序控制流程。進程內一個相對獨立的、可調度的執行單元,是系統獨立調度和分派CPU的基本單位指運行中的程序的調度單位。在單個程序中同時運行多個線程完成不一樣的工做,稱爲多線程。線程
協程coroutine和線程同樣共享堆,不共享棧,協程由程序員在協程的代碼裏顯示調度,實現用戶態中的切換。所以被認爲更輕量,開銷更低。
協程同一時間只能有一個協程運行,golang的goroutine採用的線程的方式,可能存在並行。指針
進程、線程、協程的關係和區別:協程
JAVA有2種方式實現
使用synchronized關鍵字聲明的方法,會在線程間進行同步。能夠視爲不一樣線程競爭一把鎖。當線程運行時加鎖,結束運行或異常退出時釋放
調用thread.interrupt()方法讓線程進入中斷interrupted狀態,可經過調用isInterrupted來確認是否進入中斷狀態
調用thread.wait()方法讓線程進入等待狀態,進入此狀態的線程可被其餘線程的notify()/notifyAll()方法喚醒繼續執行下文,也可被interrupt()進入中斷
若是執行wait時指定了時間。那麼當計時器到達指定時間後,若是沒有被notify喚醒,該線程也會被喚醒。