多執行緒 多執行緒原理

2021-07-06 01:52:05 字數 1621 閱讀 8322

我們首先要知道什麼是多執行緒,說白了就是多個執行緒,執行緒是什麼呢,其實就是程序執行的途徑,那麼說道這裡我們又引入了乙個新的名字,就是程序,那麼我們來看看什麼是程序,其實我們自己也能看到,啟動電腦的任務管理器,我們就可以看到程序選項,裡面是我們電腦所有的程序,我們會發現有很多的程序.

簡單地說就是程序就是我們所執行的程式,執行緒就是程序執行的途徑.

那麼引入多執行緒有什麼好處呢?

那麼我們用生活中的例子來想想一下,最簡單的就是普通的道路和高架橋,相信大家都知道北京的道路是很堵的,那麼你能想象如果把高架橋拆除,所有的車輛都走普信道路的景象嗎?那麼這就是多執行緒的優勢了,目的地只有乙個,可是我們可以有多條路徑可以到達目的地.大大的提高了執行效率.

public static void main(string args) 

}}.start(); //4,開啟執行緒

new thread(new runnable()

}}).start(); //4,開啟執行緒

}

通過以上**我們還可以知道要想實現多執行緒有兩種方式,一種是繼承thread類,重寫當中的run()方法,另一種是實現runnable介面重寫run()方法,這樣就能實現多執行緒.

但是因為電腦只有乙個cpu,儘管現在電腦一代一代在進化,四核八核,但是萬變不離其宗,我們程式要實現多執行緒執行程式,那麼就會有乙個資源共享問題,cpu資源是要被共享的,你用了我就不能用,為了避免出現這種情況,我們提出了鎖機制.

關鍵字是synchronized.

public static synchronized void print1() 

public static void print2() }

以上兩種方法都是靜態的方法,是直接可以通過類名.class直接上鎖的,而非靜態則不可以,我們下面會說明.

那麼我們可以通過synchronized給同步方法和同步**塊加鎖,這裡有print1()和print2兩種方法,他們如果都去搶乙個執行緒,那麼就會出現錯亂的字元了,我們想要的是"我是令狐沖"和"我是任盈盈"交替輸出,上了鎖就不一樣了,在print1()方法執行的時候,print2()是不會和它搶占執行緒 的,相反print2()方法也是一樣的.

那麼在這裡我們說到了同步方法和同步**塊的問題,那麼我們上了鎖就說明它是同步的,那麼我們應該怎麼區分同步方法和同步**塊呢?

第一,就是他們的鎖上的位置是不一樣的,同步方法的鎖是直接載入方法宣告上就可以了,而同步**塊的鎖是加在乙個**塊的前面;

第二,就是他們的鎖物件是不一樣的,同步方法的鎖可以是任意的物件,而同步**塊則不行,它的鎖必須是this物件,這個this也就是說,你new的是哪個物件,那麼this就指向誰.用下面的**來說明一下:

public void run() 

try catch (interruptedexception e)

system.out.println(thread.currentthread().getname() + "...這是第" + tickets-- + "號票" );

}} }

這是乙個簡單的火車票售票系統,我只貼上了一部分來說明一下,synchronized鎖的這個就是同步**塊,它的所物件必須是this物件.

多執行緒原理

計算機三大核心元件 cpu 記憶體和輸入輸出裝置 io 開啟多執行緒的最根本的目的是為了充分利用cpu,提高計算機資源利用率。cpu是傳送執行命令的地方,其只能從記憶體裡讀取指令來執行,也是執行緒排程的執行者 拿io來說,在單執行緒的情況下,假如此時有乙個執行緒需要執行io,這個過程分2個階段,1 ...

多執行緒原理(部分)

volatile修飾的變數能夠保證可見性,但不保證原子性,每個執行緒能夠獲取該變數的最新值。對volatile修飾的詞,程式在編譯的時候,會多乙個lock彙編指令如下圖所示 該lock指令有兩個主要作用 jmm主要是通過設定記憶體屏障來禁止指令重排序,下圖是匯程式設計序中的四種記憶體屏障型別 屏障型...

多執行緒(一) tomcat 多執行緒

web server允許的最大執行緒連線數還受制於作業系統的核心引數設定,通常windows是2000個左右,linux是1000個左右。1.編輯tomcat安裝目錄下的conf目錄下的server.xml檔案 maxthreads 150 表示最多同時處理150個連線,tomcat使用執行緒來處理...