步驟:
一、寫乙個類繼承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,所以休眠的是執行緒)
會發現出現了上面的問題,問題的原因就是:方法2:用實現runnable介面的方法創造執行緒物件不同的執行緒處理共享的資料時,會出現執行緒安全問題。這裡由於乙個執行緒在列印語句結束後,ticknum並沒有立馬減1,而是先休眠了一秒鐘,在這一秒鐘裡,另外乙個執行緒列印語句執行時ticket還是沒用減1時的狀態,所以出現了問題。
注意,這裡ticketnum可以是非靜態屬性這也是出現了問題,問題的原因同方法一一樣
方法一的解決synchronized的引數是同步監視器,這個同步監視器必須是唯一的,thread繼承建立的執行緒物件是多個,物件不唯一,所以不能用thissynchronized
(window.
class
)catch
(interruptedexception e)
}}
方法二的解決這個方法的同步監視器是thispublic
void
run(
)catch
(interruptedexception e)}}
}}
總結執行緒安全問題:
當多個執行緒處理共享資料(堆記憶體中的資料)時,就要考慮執行緒安全問題
對於方法一,它的共享資料是靜態資料
對於方法二,它的共享資料是屬性和非靜態資料
解決執行緒安全問題的思路:用同步**塊將涉及到共享資料的**括起來
對於方法一,鎖是類.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 方法,那麼就只是普通方法,沒有啟動多執行緒模式...