天天看點

多線程兩種實作方式的差別

 我們知道實作多線程有兩種方式:繼承Thread類和實作Runnable接口。

 那麼這兩種方式有什麼差別呢?用哪個會更好點呢?

 顯然,因為java的單繼承特性,如果用繼承Thread類的方式來實作多線程的話,此線程類就不能繼承其他的類了。是以在程式中往往要求用實作Runnable的方式來開發會更好。但這并非我們放棄用繼承Thread類的最大原因。

 這兩種方式最大的差別是在資源共享的問題,繼承Thread類的多個線程之間不能實作資源的共享,而實作Runnable接口後可以實作多個線程之間的資源共享。

 來看一下下面的這個例子就會明白了:

 某歌手到某高校開演唱會,高校作為主辦方出售10張票,分三個點售賣,這就相當于分成三個線程去完成售賣門票這件事。一共是賣出10張,直到買完所有票為止。下面通過多線程的兩種方式來看是否可以實作買票這件事:

 首先來看繼承Thread類的實作:

多線程兩種實作方式的差別

再看看結果:

多線程兩種實作方式的差別

從輸出結果:發現每個售賣點都賣出了10張票,這樣一來三個點共賣出了30張票,但一共才10張票。這顯然沒有達到資源共享的要求,未能實作三個點共同賣票的要求。

我們再來試試Runnable的實作方式:

多線程兩種實作方式的差別

輸出結果為:

多線程兩種實作方式的差別

從結果可以看出,實作Runnable的方式可以資源共享,即實作了三個點同時買票。

通過分析代碼可以看出實作Thread類的方式每新建立一個Thread類就會配置設定一個資源,是以不能共享,而實作Runnable的方式,把資源放在Runnable的實作類裡面,然後通過三個Thread類去啟動它,資源隻是存在于Runnable的實作類中,供三個啟動Thread類執行個體去調用,是以實作了共享。這就是這兩種方式實作多線程的最大差別。

關于提到的為什麼要用多線程?推薦大家去看一篇博文:

http://blog.sina.com.cn/s/blog_78edf5db0100wv8v.html

繼續閱讀