建立多執行緒的四種方法總結 同步 執行緒生命週期

2021-10-09 22:23:43 字數 3210 閱讀 7756

步驟:

一、寫乙個類繼承thread類

二、重寫run()方法,run方法中寫此執行緒執行的**

三、在main方法中new此類物件,呼叫start方法

class

mythread

extends

thread}}

}public

class

note1}}

}

通過上面的**可以發現,用這個方式新建執行緒的話,繼承thread的類就是執行緒類,它的物件就是具體的執行緒,

不同的執行緒有不同的物件,物件之間的非靜態屬性不共享資料。

總結:乙個繼承thread的類,多個物件,多個執行緒,執行緒之間不共享非靜態資料

步驟:

第一步:寫乙個類實現runnable介面

第二步:實現run方法

第三步:主方法中new此實現類

第四步:將此物件作為引數傳給thread的構造器形成執行緒物件

第五步:執行緒物件start

class

runthread

implements

runnable}}

}public

class

note2

}

通過上面的**可以發現,用這個方式新建執行緒的話,實現runnable的類的物件是作為引數傳給thread的

不同的執行緒可以有相同的物件,不同的執行緒之間可以共享資料

總結:乙個實現runnable的類,乙個物件,多個執行緒,執行緒之間共享資料

步驟:

一、寫乙個類實現callable介面

二、重寫run方法

三、在主方法中new物件

四、此物件傳給futuretask的構造器,new乙個futuretasl的物件

五、將futuretask物件傳給thread的構造器,new乙個thread物件

六、thread物件呼叫start方法

方法一:用繼承thread類的方法新建多執行緒,三個物件分別代表三個視窗。由於票數是固定的,三個視窗共享的,所以將票的數目宣告為了類變數。下面的**是沒有考慮執行緒安全的問題,為了讓執行緒安全的問題更加逼真,在run方法中使用了讓不同的物件阻塞1秒的方法。(注意,thread類裡有sleep方法,this.sleep()呼叫的不是object類的sleep,所以休眠的是執行緒)

會發現出現了上面的問題,問題的原因就是:

不同的執行緒處理共享的資料時,會出現執行緒安全問題。這裡由於乙個執行緒在列印語句結束後,ticknum並沒有立馬減1,而是先休眠了一秒鐘,在這一秒鐘裡,另外乙個執行緒列印語句執行時ticket還是沒用減1時的狀態,所以出現了問題。

方法2:用實現runnable介面的方法創造執行緒物件

注意,這裡ticketnum可以是非靜態屬性

這也是出現了問題,問題的原因同方法一一樣

方法一的解決

synchronized

(window.

class

)catch

(interruptedexception e)

}}

synchronized的引數是同步監視器,這個同步監視器必須是唯一的,thread繼承建立的執行緒物件是多個,物件不唯一,所以不能用this

方法二的解決

public

void

run(

)catch

(interruptedexception e)}}

}}

這個方法的同步監視器是this

總結執行緒安全問題:

當多個執行緒處理共享資料(堆記憶體中的資料)時,就要考慮執行緒安全問題

對於方法一,它的共享資料是靜態資料

對於方法二,它的共享資料是屬性和非靜態資料

解決執行緒安全問題的思路:用同步**塊將涉及到共享資料的**括起來

對於方法一,鎖是類.class

對於方法二,鎖是this

噢,時間太晚了,明天總結執行緒生命週期以及控制方法。

synchronized (this)  catch (interruptedexception e) 

system.out.println(thread.currentthread().getname() + " :" + i);

try catch (interruptedexception e) }}

執行緒同步四種方法

執行緒同步的方法 1 wait 使乙個執行緒處於等待狀態,並且釋放所持有的物件的lock。2 sleep 使乙個正在執行的執行緒處於睡眠狀態,是乙個靜態方法,呼叫此方法要捕捉 interruptedexception異常。3 notify 喚醒乙個處於等待狀態的執行緒,注意的是在呼叫此方法的時候,並...

建立執行緒的四種方法

一 繼承thread類 建立乙個類並繼承thread類以後重寫run 方法,建立子類的例項,之後用子類建立的物件.start 即可啟動執行緒。如下 public class firstthread extends thread public static void main string args ...

多執行緒 四種建立方式

public class threadestablish1 start 主線程 for int i 0 i 100 i 1.建立乙個實現了thread類的子類 class subthread extends thread 注意點 如果自己手動呼叫run 方法,那麼就只是普通方法,沒有啟動多執行緒模式...