Java中繼承thread類與實現Runnable接口的區別

Java中線程的創建有兩種方式:

?

1.??通過繼承Thread類,重寫Thread的run()方法,將線程運行的邏輯放在其中

2.??通過實現Runnable接口,實例化Thread類

?

??? 在實際應用中,我們經常用到多線程,如車站的售票系統,車站的各個售票口相當于各個線程。當我們做這個系統的時候可能會想到兩種方式來實現,繼承Thread類或實現Runnable接口,現在看一下這兩種方式實現的兩種結果。

?

?

Java代碼??
  1. package?com.threadtest;??
  2. class?MyThread?extends?Thread{??
  3. ??????
  4. ????private?int?ticket?=?10;??
  5. ????private?String?name;??
  6. ????public?MyThread(String?name){??
  7. ????????this.name?=name;??
  8. ????}??
  9. ??????
  10. ????public?void?run(){??
  11. ????????for(int?i?=0;i<500;i++){??
  12. ????????????if(this.ticket>0){??
  13. ????????????????System.out.println(this.name+"賣票---->"+(this.ticket--));??
  14. ????????????}??
  15. ????????}??
  16. ????}??
  17. }??
  18. public?class?ThreadDemo?{??
  19. ??
  20. ??????
  21. ????public?static?void?main(String[]?args)?{??
  22. ????????MyThread?mt1=?new?MyThread("一號窗口");??
  23. ????????MyThread?mt2=?new?MyThread("二號窗口");??
  24. ????????MyThread?mt3=?new?MyThread("三號窗口");??
  25. ????????mt1.start();??
  26. ????????mt2.start();??
  27. ????????mt3.start();??
  28. ????}??
  29. ??
  30. }??

?

?

運行結果如下:

Java代碼??
  1. 一號窗口賣票---->10??
  2. 一號窗口賣票---->9??
  3. 二號窗口賣票---->10??
  4. 一號窗口賣票---->8??
  5. 一號窗口賣票---->7??
  6. 一號窗口賣票---->6??
  7. 三號窗口賣票---->10??
  8. 一號窗口賣票---->5??
  9. 一號窗口賣票---->4??
  10. 一號窗口賣票---->3??
  11. 一號窗口賣票---->2??
  12. 一號窗口賣票---->1??
  13. 二號窗口賣票---->9??
  14. 二號窗口賣票---->8??
  15. 三號窗口賣票---->9??
  16. 三號窗口賣票---->8??
  17. 三號窗口賣票---->7??
  18. 三號窗口賣票---->6??
  19. 三號窗口賣票---->5??
  20. 三號窗口賣票---->4??
  21. 三號窗口賣票---->3??
  22. 三號窗口賣票---->2??
  23. 三號窗口賣票---->1??
  24. 二號窗口賣票---->7??
  25. 二號窗口賣票---->6??
  26. 二號窗口賣票---->5??
  27. 二號窗口賣票---->4??
  28. 二號窗口賣票---->3??
  29. 二號窗口賣票---->2??
  30. 二號窗口賣票---->1??

?

通過實現Runnable接口的代碼如下:
?

Java代碼??
  1. package?com.threadtest;??
  2. class?MyThread1?implements?Runnable{??
  3. ????private?int?ticket?=10;??
  4. ????private?String?name;??
  5. ????public?void?run(){??
  6. ????????for(int?i?=0;i<500;i++){??
  7. ????????????if(this.ticket>0){??
  8. ????????????????System.out.println(Thread.currentThread().getName()+"賣票---->"+(this.ticket--));??
  9. ????????????}??
  10. ????????}??
  11. ????}??
  12. }??
  13. public?class?RunnableDemo?{??
  14. ??
  15. ??????
  16. ????public?static?void?main(String[]?args)?{??
  17. ????????//?TODO?Auto-generated?method?stub??
  18. ????????//設計三個線程??
  19. ?????????MyThread1?mt?=?new?MyThread1();??
  20. ?????????Thread?t1?=?new?Thread(mt,"一號窗口");??
  21. ?????????Thread?t2?=?new?Thread(mt,"二號窗口");??
  22. ?????????Thread?t3?=?new?Thread(mt,"三號窗口");??
  23. //?????????MyThread1?mt2?=?new?MyThread1();??
  24. //?????????MyThread1?mt3?=?new?MyThread1();??
  25. ?????????t1.start();??
  26. ?????????t2.start();??
  27. ?????????t3.start();??
  28. ????}??
  29. ??
  30. }??

?

運行結果如下:

Java代碼??
  1. 一號窗口賣票---->10??
  2. 三號窗口賣票---->9??
  3. 三號窗口賣票---->7??
  4. 三號窗口賣票---->5??
  5. 三號窗口賣票---->4??
  6. 三號窗口賣票---->3??
  7. 三號窗口賣票---->2??
  8. 三號窗口賣票---->1??
  9. 一號窗口賣票---->8??
  10. 二號窗口賣票---->6??

?

?

????為什么會出現這種結果吶。我們不妨做個比喻,其實剛的程序,

繼承Thread類的,我們相當于拿出三件事即三個賣票10張的任務分別分給三個窗口,他們各做各的事各賣各的票各完成各的任務,因為MyThread繼承Thread類,所以在new MyThread的時候在創建三個對象的同時創建了三個線程;

實現Runnable的,?相當于是拿出一個賣票10張得任務給三個人去共同完成,new MyThread相當于創建一個任務,然后實例化三個Thread,創建三個線程即安排三個窗口去執行。

?????

用圖表示如下:



?

?? 在我們剛接觸的時候可能會迷糊繼承Thread類和實現Runnable接口實現多線程,其實在接觸后我們會發現這完全是兩個不同的實現多線程,一個是多個線程分別完成自己的任務,一個是多個線程共同完成一個任務。

?????

????其實在實現一個任務用多個線程來做也可以用繼承Thread類來實現只是比較麻煩,一般我們用實現Runnable接口來實現,簡潔明了。

??????

????大多數情況下,如果只想重寫?run()?方法,而不重寫其他?Thread?方法,那么應使用?Runnable?接口。這很重要,因為除非程序員打算修改或增強類的基本行為,否則不應為該類(Thread)創建子類。

轉載于:https://www.cnblogs.com/felixzh/p/5985832.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254151.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254151.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254151.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【VMware vSAN 6.6】6.2.啟用性能服務:vSAN硬件服務器解決方案

目錄 1. 簡介 1.1.適用于HCI的企業級存儲2. 體系結構 2.1.帶有本地存儲的服務器2.2.存儲控制器虛擬系統套裝的缺點2.3.vSAN在vSphere Hypervisor中自帶2.4.集群類型2.5.硬件部署選項3. 啟用vSAN 3.1.啟用vSAN3.2.輕松安裝3.3.主動測試4. 可用性 4.1.對象和組件安置4.2.重新構建…

Android eclipse導入項目后出現Unable to resolve target #39;android-17#39;解決方法

eclipse導入項目后出現Unable to resolve target android-17解決方法。在最后附帶還有一種編譯邏輯不成功情況解決方法。 一、問題情況 二、解決的方法 1、改動項目的目標版本號與當前Android sdk相相應的版本號 2、自己主動修復一下項目 三、這個問題不是上面的。是另外情況&a…

多個圓點,鼠標選取兩個,求兩個點的距離,用于計算像素尺寸(halcon實現)

read_image (Image, C:/Users/22967/Desktop/晶圓找位置/0.bmp) dev_close_window () dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle) dev_display (Image)binary_threshold (Image, Region1, max_separability, dark, UsedThreshold) connection (Region1, C…

修改UBOOT和LINUX調試串口(TI達芬奇芯片--DM6467)

Posted on 2011-10-31 10:53 jamiedu 閱讀(889) 評論(0) 編輯 收藏 1.1 概述 TI針對DM6467提供的UBOOT和內核默認都是串口0作為調試串口輸出的&#xff0c;但現在我需要使用DM6467的UART0的modem功能&#xff0c;所以修改代碼&#xff0c;改變調試串口為串口2。 需要修改的主要…

Java List與數組之間的轉換

http://blog.csdn.net/kingzone_2008/article/details/8444678轉載于:https://www.cnblogs.com/longshiyVip/p/5985981.html

受歡迎的五個開源可視化工具——你的選擇是?

摘要&#xff1a;大數據時代&#xff0c;數據為王&#xff0c;還在對一堆數據而發愁嗎&#xff1f;試試可視化工具吧&#xff0c;相信本文提到的五款工具有一款能夠幫助到你。人工智能時代&#xff0c;數據和算法以及硬件資源是非常重要的&#xff0c;相關行業的大公司也越來越…

halcon車刀崩邊檢測

list_files (新建文件夾, files, Files) read_image (Image, Files[0]) dev_close_window () get_image_size (Image, Width, Height) dev_open_window (0, 0, Width/1.5, Height/1.5, black, WindowHandle) dev_set_draw (margin) dev_set_colored (12) for Index:0 to |Files…

FFMPEG解碼264文件步驟

本文以H264視頻流為例&#xff0c;講解解碼流數據的步驟。 為突出重點&#xff0c;本文只專注于討論解碼視頻流數據&#xff0c;不涉及其它&#xff08;如開發環境的配置等&#xff09;。如果您需要這方面的信息&#xff0c;請和我聯系。 準備變量 定義AVCodecContext。如果…

Storm概念學習系列之storm的特性

不多說&#xff0c;直接上干貨&#xff01; storm的特性 Storm 是一個開源的分布式實時計算系統&#xff0c;可以簡單、可靠地處理大量的數據流。 Storm支持水平擴展&#xff0c;具有高容錯性&#xff0c;保證每個消息都會得到處理&#xff0c;而且處理速度很快&#xff08;在一…

Confluence 6 配置服務器基礎地址示例

2019獨角獸企業重金招聘Python工程師標準>>> 如果 Confluence 的安裝是沒有安裝在非根目錄路徑&#xff08;這個是上下文路徑&#xff09;&#xff0c;然后服務器基礎 URL 地址應該包括上下文地址。例如&#xff0c;你的 Confluence 正在運行在下面的地址&#xff1…

BootstrapValidator驗證

bootstrap&#xff1a;能夠增加兼容性的強大框架. 因為項目需要數據驗證&#xff0c;看bootstrapValidator 還不錯&#xff0c;就上手一直&#xff0c;完美兼容&#xff0c;話不多說。 需要引用css&#xff1a; bootstrap.min.css bootstrapValidator.min.css js: jquery-1.10.…

基于ARM9的視頻采集傳輸系統

http://www.ic37.com/htm_tech/2007-11/77189_618093.htm

halcon找矩形頂點的一種方法

主程序&#xff1a; read_image (Image11, 11)*畫仿射矩形 dev_set_color (green) draw_rectangle2 (3600, Row, Column, Phi, Length1, Length2)*生成仿射矩形xld gen_rectangle2_contour_xld (Rectangle, Row, Column, Phi, Length1, Length2) *找頂點工具&#xff08;基于卡…

老男孩linux運維50期

一、自我介紹&#xff1a;我是來自老男孩Linux運維脫產50期的楊國峰&#xff0c;我以前是學軟件編碼的&#xff0c;但在大學里基本沒怎么學&#xff0c;每一門課都一知半解的&#xff0c;甚至有些連軟件都不會裝&#xff0c;在校期間&#xff0c;我對JAVA、網頁設計等都不感興趣…

博客收藏

http://www.dreamfairy.cn/blog/category/unity3d/轉載于:https://www.cnblogs.com/wantnon/p/5989843.html

移動開發平臺性能比較

jquerymobile是一個mobile平臺下的js框架,跟phonegap沒有一毛錢關系.phonegap實際上在國內占有率不高的,非常多人為了體驗喜歡做傳統的原生手機應用. 而Webapp如今的占有率越來越少,由于越來越多的人不喜歡用手機瀏覽器去體驗專門為移動平臺搭建的站點.我認為你的比較對象應該是…

H264關于RTP協議的實現

完整的C&#xff0f;S架構的基于RTP&#xff0f;RTCP的H&#xff0e;264視頻傳輸方案。此方案中&#xff0c;在服務器端和客戶端分別進行了功能模塊設計。服務器端&#xff1a;RTP封裝模塊主要是對H&#xff0e;264碼流進行打包封裝&#xff1b;RTCP分析模塊負責產牛和發送RTCP…

華為數通HCIE面試題目解密系列之RSTP邊緣端口

以下是華為數通面試考試的一道真題&#xff0c;原題如下&#xff1b; 請舉例說明 stp 的 edge port 的作用,用在什么場景&#xff0c;并且使用 edge port 會碰到什么問題&#xff0c;怎么解決和防止&#xff1f; 提到邊緣端口&#xff0c;我們是在NP課程的交換部分第一次接觸&a…

VS2013 Pro版本密鑰

Visual Studio Professional 2013 KEY&#xff08;密鑰&#xff09;&#xff1a; XDM3T-W3T3V-MGJWK-8BFVD-GVPKY 轉載于:https://www.cnblogs.com/Mysterious/p/5990358.html

Django:視圖和URL配置

一、視圖1.在mysite文件夾下。創建views.py文件&#xff08;文件名稱沒有特別的要求&#xff09;&#xff1b;from django.http import HttpResponsedef hello(request):return HttpResponse("Hello world")2.改動mysite文件夾下的urls.py文件&#xff1b;from djang…