java多執行緒程式設計(一基礎概念)

2021-09-08 18:06:58 字數 1907 閱讀 4736

1、程序和執行緒

程序,是乙個正在執行的程式實體,windows下常見的就是***.exe,在任務管理器中可以看見很多個程序。它是執行緒的容器。

執行緒,是程序中的乙個執行流。在單執行緒程式設計中,我們的程式只有乙個執行流:主線程的main方法。流,表明執行的過程是有順序的,如main函式中的語句需要一條一條的按順序執行,第一條語句沒執行完,就不能去執行第二條語句。

可見,單執行緒程式設計是有限制的,那就是我們的語句只能序列執行,不可能發生某些語句同時執行的現象。有時我們希望某些**並行執行,就好比我們一邊吃飯,一邊看電視。這個時候,就需要使用多執行緒程式設計技術了。

需要注意的是:乙個程式至少有乙個執行緒,那就是主線程,它對應的方法是main方法。那麼,其他執行緒的建立,就需要借助某乙個先前已經存在的執行緒去建立和引發。這個先前存在的執行緒可以是主線程的main方法,也可以是被main建立的新的執行緒。

如下圖,主線程中,執行到某個時刻,建立了(至於怎麼建立新的執行緒稍後會講解)新的執行緒thread-1,從此,cpu就比以前"忙"起來了,因為它要去執行2個執行緒總的**。真的是「同時執行」2個執行緒的**嗎?答案是否定的。cpu本身是沒有所謂的並行執行的能力的,也無所謂多執行緒,多執行緒是本機作業系統支援的。

作業系統將程序執行緒進行管理,輪流(沒有固定的順序)分配每個程序很短的一段是時間(不一定是均分)。

然後在每個執行緒內部,程式**自己處理該程序內部執行緒的時間分配,多個執行緒之間相互的切換去執行,這個切換時間也是非常短的。

因此多工、多程序、多執行緒都是作業系統給人的一種巨集觀感受,從微觀角度看,程式的執行是非同步執行的。

我們知道就可以了,關於底層cpu到底如何做,我們並不需要關心。我們關心的是如何通過**去建立和操作我們的執行緒。我們就當我們的執行緒都是「並行執行的」。

2、呼叫棧

什麼是呼叫棧?在以前單執行緒程式設計中,就拿main函式來說吧。以乙個列子來說明。

public

class

test

public

static

void

main(string args)

}

作業系統呼叫main函式,因為main函式是程式的入口,那麼main函式就入棧了,main會占用一定的記憶體,因為裡面有引數args和區域性變數x,y,re。當執行到add函式呼叫時,這時main函式「掛起」,執行流進入add函式,add函式入棧,同樣系統也會為add函式分配臨時記憶體空間,當add函式執行完,add函式出棧,返回結果,它占用的記憶體被**,執行流再次回到main函式,執行到println函式,println函式入棧。。。。。println出棧,執行流再回到main,main執行完畢,程式結束,系統**本程式的記憶體。

注意:這裡的棧只是乙個作業系統管理函式呼叫的模型而已,並不是資料結構中的棧,只不夠二者的邏輯結構是一致的:filo。

在多執行緒程式設計中,每乙個執行緒都有自己的乙個呼叫棧,來管理自己的函式呼叫。

3、需要記住的事項

一、執行緒之間共享記憶體資料,這使得資料訪問更加的快捷,方便。

二、乙個使用多執行緒的程式,如果有任何乙個執行緒沒有結束,那麼,這個程式就不會結束執行。

三、jvm的執行緒排程模式採用了搶占式模式。搶占式排程是根據執行緒的優先級別來獲取cpu的使用權。但是這個也並不一定,cpu執行執行緒的順序由作業系統和jvm共同

決定。但每乙個線

程的單次執行時間是一定的,這個時間叫時間片,在linux系統中,預設時間片為1/100s。

java多執行緒 基礎概念

join 方法 在很多情況下,主線程生成並起動了子執行緒,如果子執行緒裡要進行大量的耗時的運算,主線程往往將於子執行緒之前結束,但是如果主線程處理完其他的事務後,需要用到子執行緒的處理結果,也就是主線程需要等待子執行緒執行完成之後再結束,這個時候就要用到join 方法了。wait方法 呼叫obj的w...

Java 多執行緒程式設計 (一)概念

博文只是用來記筆記,內容如有不對請各位大佬指出 一 概念 程序百科中的解釋是這樣的 程序 process 是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎百科中的解釋是這樣的 程序 process 是計算機中的程式關於某資料集合上的一次執行活動...

Java多執行緒之基礎概念

執行緒狀態的扭轉圖如下 time waiting 限期等待狀態,不會分配cpu時間片,睡眠時間到或等待一定的時間後自動喚醒。以下方法會讓執行緒進入該狀態 dead 死亡狀態,執行緒正常執行完了或因異常退出了run 方法,該執行緒結束生命週期 interrupt 方法 中斷執行緒,本質是將某執行緒的中...