多執行緒的應用

2021-09-08 17:23:31 字數 2262 閱讀 2297

一、程序和執行緒的概念:每乙個程式執行都是乙個程序,都有乙個執行的路徑,在這個程序中又有很多的執行緒,來執行不同的**。就想我們在電腦上同時開啟許多個程式一樣,如果是單核cpu處理器的情況,那麼,cpu只會執行乙個程式,而我們視覺上感覺都在執行,那是因為cpu在完成快速的切換;

在main函式中,進行著乙個主線程,也就是乙個程式至少有乙個執行緒。

二、執行緒的幾種狀態:

1、執行狀態:這個時候執行緒既有執行資格,又有執行權。

2、臨時狀態:這個時候執行緒處於等待狀態,等待cpu給它分配資源,這個時候它有執行資格,但是沒有執行權。

3、凍結狀態:在執行中的執行緒,可以使其sleep()或者wait()來實現凍結,這個時候執行緒放棄了執行資格。

4.   消亡狀態:執行緒執行完畢,或者呼叫stop()函式使其停止,都會使執行緒進入消亡狀態。

三、建立執行緒的兩種方法:

1、通過繼承thread來建立執行緒:

(1)、建立乙個子類繼承extends  thread類

(2)、在子類中重寫run()方法。

(3)、建立乙個子類的物件,就是建立了乙個執行緒

(4)、呼叫start()方法,啟動執行緒,並且執行run()方法。

2、通過實現runnable介面來建立執行緒。

(1)、建立乙個子類來實現runnable介面

(2)、重寫runnable介面中的run()方法

(3)、在主函式中使用子類建立物件

(4)、thread 建立執行緒,然後把子類物件作為引數傳進去。

四、呼叫run()方法和start()方法的區別:

如果直接呼叫run()方法,那麼和普通的函式呼叫沒有任何區別,就是先去執行呼叫函式,然後再返回到主函式中來順序執行,其實執行緒並沒有被啟動。而呼叫start()方法,進行了兩個步驟,一是啟動執行緒,而是呼叫run()方法,但是呼叫之後,執行緒並沒有進入執行狀態,而是出於臨時狀態,它有執行資格,但是沒有執行權,出於等待cpu分配資源的階段。

五、為什麼要覆蓋thread或者介面中的run()方法

因為run()方法能被執行緒所呼叫,所以run()方法中通常是我們要執行的**,所以,我們在定義乙個子類時,要把我們要執行緒來執行的程式**放進去,所以要重寫run()方法;

六、同步**塊和同步函式

1、同步**塊的應用,我們知道在多個執行緒同時操作一段**時,如果執行到某一句**時,cpu有可能切換到其他的執行緒,這樣保留的資料就會改變,不能確保安全性,為了提高**的安全性,我們要給特定的**上鎖。以確定在某乙個執行緒能夠執行時,其他的執行緒進不去。

格式如下:synchronized(物件)

同步函式:public  synchronized  void    show()

給函式或者**塊上鎖確實能夠提高安全性,但是也耗費了資源,因為執行緒每次執行都要進行判斷,而且如果某執行緒在執行中睡眠或者異常,哪怕其他的執行緒搶到課cpu 的執行權,也進不去。

2.同步函式中用的鎖是this   ,靜態同步方法使用鎖是該方法所在類的位元組碼檔案物件(類名、class)。

七、實現方法和繼承方法的區別:實現方法可以避免單繼承的侷限性,比如student類它繼承了person這個類,而它裡面需要多執行緒來完成的**時,那麼它是不能夠再去繼承thread類,所以,介面runnable解決了這個問題。

1、獲取執行緒名稱的方法:thread.currentthread(),獲取當前執行緒的名稱

2.設定執行緒名稱有兩種方式:一是:通過建構函式初始化,然後在super()呼叫父類的方法;

二是:通過父類thread中的方法setname()來完成。

下面通過**來體現上面的一些概念:

案例一:

class threaddemo}}

//建立乙個類繼承thread執行緒類

class athread extends thread

public void run()//重寫thread中run()方法}}

案例二:賣票程式

class ticketdemo

}//定義乙個類,實現介面runnable

class ticket implements runnable

catch(exception e){}

system.out.println("正在賣第"+ticket--+"張票");}}

}}}

案例三:銀行存錢系統:

class bankdemo

}//建立乙個類,實現runnable介面

class bank implements runnable}}

//定義乙個存錢的類

class deposit}}

多執行緒應用

例題 編寫兩個執行緒,一乙個執行緒列印1 52 的整數,另乙個執行緒列印字母a z。列印順序為12a34b56c.5152z.即按照整數和字母的順序從小到大列印,並且每列印兩個整數後,列印一 個字母,交替迴圈列印,直到列印到整數52和字母z結束。要求 1 編寫列印類printer,宣告私有屬性ind...

Java 多執行緒的應用

class info 主資訊類 public string getname public void setcontent string content public string getcontent public synchronized void set string name,string c...

多執行緒 join的應用

如果我們有多個子任務需要用多執行緒來處理,但是主線程又需要等待所有子執行緒執行完成後在返回,最簡單的做法就是使用執行緒的join方法。示例 如下 public class jointest catch interruptedexception e system.out.println thread....