下面以典型的買票程式(基本都是以這個為例子)為例,來說明二者的區別。
首先通過繼承thread類實現,**如下:
1執行結果如下:class mythread extends
thread
9}
10}
11}
1213
public
class
threaddemo
19 }
從結果中可以看出,每個執行緒單獨賣了5張票,即獨立地完成了買票的任務,但實際應用中,比如火車站售票,需要多個執行緒去共同完成任務,在本例中,即多個執行緒共同買5張票。
通過實現runnable介面實現的多執行緒程式,**如下:
1執行結果如下:class mythread implements
runnable
9}
10}
11}
1213
public
class
runnabledemo
20 }
從結果中可以看出,三個執行緒一共賣了5張票,即它們共同完成了買票的任務,實現了資源的共享。
針對以上**補充三點:
1、在第二種方法(runnable)中,ticket輸出的順序並不是54321,這是因為執行緒執行的時機難以**,ticket--並不是原子操作。
2、在第一種方法中,我們new了3個thread物件,即三個執行緒分別執行三個物件中的**,因此便是三個執行緒去獨立地完成賣票的任務;而在第二種方法中,我們同樣也new了3個thread物件,但只有乙個runnable物件,3個thread物件共享這個runnable物件中的**,因此,便會出現3個執行緒共同完成賣票任務的結果。如果我們new出3個runnable物件,作為引數分別傳入3個thread物件中,那麼3個執行緒便會獨立執行各自runnable物件中的**,即3個執行緒各自賣5張票。
3、在第二種方法中,由於3個thread物件共同執行乙個runnable物件中的**,因此可能會造成執行緒的不安全,比如可能ticket會輸出-1(如果我們system.out....語句前加上執行緒休眠操作,該情況將很有可能出現),這種情況的出現是由於,乙個執行緒在判斷ticket為1>0後,還沒有來得及減1,另乙個執行緒已經將ticket減1,變為了0,那麼接下來之前的執行緒再將ticket減1,便得到了-1。這就需要加入同步操作(即互斥鎖),確保同一時刻只有乙個執行緒在執行每次for迴圈中的操作。而在第一種方法中,並不需要加入同步操作,因為每個執行緒執行自己thread物件中的**,不存在多個執行緒共同執行同乙個方法的情況。
Thread 和 Runnable 的區別
thread 和 runnable 的區別 實際上,thread也是乙個runnable,它實現了runnable介面,在thread類中有乙個runnable型別的target欄位,代表要被執行在這個子執行緒中的任務。public class thread implements runnable ...
Thread和Runnable的區別
runnable比thread要多一些優勢,主要是以下兩點 第一點就不多說了,至於第二點看以下兩個 示例就清楚了 static class ticketthread extends thread public static void main string args 以上是使用thread方式寫的,...
Thread和Runnable的區別
乙個程式中想要實現執行緒可以通過繼承thread或者實現runable介面來實現,兩者之間的區別有 1.繼承只能單繼承而實現可以多實現。2.thread和runnable是 模式 runnable定義執行緒規範 run thread實現執行緒作用 start 3.runnable共享資料更方便 例子...