在正式編寫文章前小編先引用網上別人的一段話來加深大家的對文章的理解:
單進程單線程等于:一個人在一個桌子上吃菜。
單進程多線程等于:多個人在同一個桌子上一起吃菜。
多進程單線程等于:多個人每個人在自己的桌子上吃菜。
多線程的問題是多個人同時吃一道菜的時候容易發生爭搶,例如兩個人同時夾一個菜,一個人剛伸出筷子,結果伸到的時候已經被夾走菜了。資源共享就會發生沖突爭搶。
使用多線程的優點(相對使用多進程來說):
進程之間不能共享內存,但線程之間共享內存非常容易。
系統創建線程所分配的資源相對創建進程而言,代價非常小。
二、Java中實現多線程的3種方法介紹和比較
繼承Thread類
實現Runnable接口
實現Callable接口
這三種方法的介紹和比較
一、實現Runnable接口相比繼承Thread類有如下優勢
1)可以避免由于Java的單繼承特性而帶來的局限
2)增強程序的健壯性,代碼能夠被多個線程共享,代碼與數據是獨立的
3)適合多個相同程序代碼的線程去處理同一資源的情況
4)線程池只能放入實現Runable或Callable類線程,不能直接放入繼承Thread的類
二、實現Runnable接口和實現Callable接口的區別
1)Runnable是自從java1.1就有了,而Callable是1.5之后才加上去的
2)實現Callable接口的任務線程能返回執行結果,而實現Runnable接口的任務線程不能返回結果
3)Callable接口的call()方法允許拋出異常,而Runnable接口的run()方法的異常只能在內部消化,不能繼續上拋
4)加入線程池運行,Runnable使用ExecutorService的execute方法,Callable使用submit方法
注:Callable接口支持返回執行結果,此時需要調用FutureTask.get()方法實現,此方法會阻塞主線程直到獲取返回結果,當不調用此方法時,主線程不會阻塞
三、Runnable、Thread、Callable案例
3.1、種實現方法—繼承Thread類
繼承Thread類,需要覆蓋方法 run()方法,在創建Thread類的子類時需要重寫 run(),加入線程所要執行的代即可。
3.2、第二種實現方法—實現Runnable接口
如果要實現多繼承就得要用implements,Java 提供了接口 java.lang.Runnable 來解決上邊的問題。
Runnable是可以共享數據的,多個Thread可以同時加載一個Runnable,當各自Thread獲得CPU時間片的時候開始運行Runnable,Runnable里面的資源是被共享的,所以使用Runnable更加的靈活。PS:需要解決共享之后產生的資源競爭問題。
3.3、第三種—實現Callable接口
Runnable是執行工作的獨立任務,但是它不返回任何值。如果你希望任務在完成的能返回一個值,那么可以實現Callable接口而不是Runnable接口。在Java SE5中引入的Callable是一種具有類型參數的泛型,它的參數類型表示的是從方法call()(不是run())中返回的值。
再來看看它們三個之間的總結。
4.1、實現Runnable接口相比繼承Thread類有如下優勢
1)可以避免由于Java的單繼承特性而帶來的局限
2)增強程序的健壯性,代碼能夠被多個線程共享,代碼與數據是獨立的
3)適合多個相同程序代碼的線程去處理同一資源的情況
4)線程池只能放入實現Runable或Callable類線程,不能直接放入繼承Thread的類
4.2、實現Runnable接口和實現Callable接口的區別
1)Runnable是自從java1.1就有了,而Callable是1.5之后才加上去的
2)實現Callable接口的任務線程能返回執行結果,而實現Runnable接口的任務線程不能返回結果
3)Callable接口的call()方法允許拋出異常,而Runnable接口的run()方法的異常只能在內部消化,不能繼續上拋
4)加入線程池運行,Runnable使用ExecutorService的execute方法,Callable使用submit方法
注:Callable接口支持返回執行結果,此時需要調用FutureTask.get()方法實現,此方法會阻塞主線程直到獲取返回結果,當不調用此方法時,主線程不會阻塞
五、其他
當然,關于多線程,只掌握這些肯定不夠。還有多線程的實現原理,還有深入理解Java線程池,這樣才能更好地使用多線程。在后面小編也會在文章中會不斷的更新。
粵嵌科技創辦于2005年是一家IT高新技術企業,專注IT職業教育13年,主要培訓課程分別有嵌入式培訓、Java培訓、Unity游戲開發、Python人工智能、HTML5前端開發、全棧UI設計、網絡營銷、CCIE網絡等專業課程