詳解多線程及Runable 和Thread的區(qū)別
Thread和Runnable區(qū)別
執(zhí)行多線程操作可以選擇
繼承Thread類
實(shí)現(xiàn)Runnable接口
1.繼承Thread類
以賣票窗口舉例,一共5張票,由3個(gè)窗口進(jìn)行售賣(3個(gè)線程)。
代碼:
package thread; public class ThreadTest { public static void main(String[] args) { MyThreadTest mt1 = new MyThreadTest("窗口1"); MyThreadTest mt2 = new MyThreadTest("窗口2"); MyThreadTest mt3 = new MyThreadTest("窗口3"); mt1.start(); mt2.start(); mt3.start(); } } class MyThreadTest extends Thread{ private int ticket = 5; private String name; public MyThreadTest(String name){ this.name = name; } public void run(){ while(true){ if(ticket < 1){ break; } System.out.println(name + " = " + ticket--); } } }
執(zhí)行結(jié)果:
窗口1 = 5
窗口1 = 4
窗口1 = 3
窗口1 = 2
窗口1 = 1
窗口2 = 5
窗口3 = 5
窗口2 = 4
窗口3 = 4
窗口3 = 3
窗口3 = 2
窗口3 = 1
窗口2 = 3
窗口2 = 2
窗口2 = 1
結(jié)果一共賣出了5*3=15張票,這違背了"5張票"的初衷。
造成此現(xiàn)象的原因就是:
MyThreadTest mt1 = new MyThreadTest("窗口1"); MyThreadTest mt2 = new MyThreadTest("窗口2"); MyThreadTest mt3 = new MyThreadTest("窗口3"); mt1.start(); mt2.start(); mt3.start();
一共創(chuàng)建了3個(gè)MyThreadTest對(duì)象,而這3個(gè)對(duì)象的資源不是共享的,即各自定義的ticket=5是不會(huì)共享的,因此3個(gè)線程都執(zhí)行了5次循環(huán)操作。
2.實(shí)現(xiàn)Runnable接口
同樣的例子,代碼:
package thread; public class RunnableTest { public static void main(String[] args) { MyRunnableTest mt = new MyRunnableTest(); Thread mt1 = new Thread(mt,"窗口1"); Thread mt2 = new Thread(mt,"窗口2"); Thread mt3 = new Thread(mt,"窗口3"); mt1.start(); mt2.start(); mt3.start(); } } class MyRunnableTest implements Runnable{ private int ticket = 5; public void run(){ while(true){ if(ticket < 1){ break; } System.out.println(Thread.currentThread().getName() + " = " + ticket--); } } }
結(jié)果:
窗口1 = 5
窗口1 = 2
窗口3 = 4
窗口2 = 3
窗口1 = 1
結(jié)果賣出了預(yù)期的5張票。
原因在于:
MyRunnableTest mt = new MyRunnableTest(); Thread mt1 = new Thread(mt,"窗口1"); Thread mt2 = new Thread(mt,"窗口2"); Thread mt3 = new Thread(mt,"窗口3"); mt1.start(); mt2.start(); mt3.start();
只創(chuàng)建了一個(gè)MyRunnableTest對(duì)象,而3個(gè)Thread線程都以同一個(gè)MyRunnableTest來(lái)啟動(dòng),所以他們的資源是共享的。
以上所述是小編給大家介紹的多線程及Runable 和Thread的區(qū)別詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Java人機(jī)猜拳實(shí)現(xiàn)的思路及方法實(shí)例
這篇文章主要給大家介紹了關(guān)于Java人機(jī)猜拳實(shí)現(xiàn)的思路及方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12SpringBoot前后端分離項(xiàng)目之打包、部署到服務(wù)器詳細(xì)圖文流程
作為后臺(tái)開(kāi)發(fā),項(xiàng)目打包部署是經(jīng)常性的操作,下面這篇文章主要給大家介紹了關(guān)于SpringBoot前后端分離項(xiàng)目之打包、部署到服務(wù)器的相關(guān)資料,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12IDEA使用學(xué)生郵箱無(wú)法注冊(cè)問(wèn)題:JetBrains Account connection error: 拒絕連接
這篇文章主要介紹了IDEA使用學(xué)生郵箱無(wú)法注冊(cè)問(wèn)題:JetBrains Account connection error: 拒絕連接,文中通過(guò)圖文及示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07@SpringBootTest 注解報(bào)紅問(wèn)題及解決
這篇文章主要介紹了@SpringBootTest 注解報(bào)紅問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11詳解Java兩種方式簡(jiǎn)單實(shí)現(xiàn):爬取網(wǎng)頁(yè)并且保存
本篇文章主要介紹了Java兩種方式簡(jiǎn)單實(shí)現(xiàn):爬取網(wǎng)頁(yè)并且保存 ,主要用UrlConnection、HttpClient爬取實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-12-12使用spring-data-redis中的Redis事務(wù)
這篇文章主要介紹了使用spring-data-redis中的Redis事務(wù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07