創(chuàng)建java多線程程序
創(chuàng)建多線程程序的第一種方式:創(chuàng)建Thread類的子類
java.lang.Thread類:是描述線程的類,我們想要實現(xiàn)多線程程序,就必須繼承Thread類
實現(xiàn)步驟:
- 創(chuàng)建一個Thread類的子類
- 在Thread類的子類中重寫Thread類中的run方法,設(shè)置線程任務(wù)(開啟線程要做什么?)
- 創(chuàng)建Thread類的子類對象
- 調(diào)用Thread類中的方法start方法,開啟新的線程,執(zhí)行run方法
void start()使該線程開始執(zhí)行;Java虛擬機(jī)調(diào)用該線程的run方法。
結(jié)果是兩個線程并發(fā)地運(yùn)行﹔當(dāng)前線程〈main線程〉和另一個線程〈創(chuàng)建的新線程,執(zhí)行其run方法)。
多次啟動一個線程是非法的(只能調(diào)用一次start方法)。特別是當(dāng)線程已經(jīng)結(jié)束執(zhí)行后,不能再重新啟動。
java程序?qū)儆趽屨际秸{(diào)度,那個線程的優(yōu)先級高,那個線程優(yōu)先執(zhí)行;同一個優(yōu)先級,隨機(jī)選擇一個執(zhí)行
public class threadex extends Thread{ public void run(){ for (int i = 0; i < 20; i++) { System.out.println("run"+i); } } }
public class thread { public static void main(String[] args) { threadex mt=new threadex(); mt.start(); for (int i = 0 ; i < 20; i++) { System.out.println("main"+i); } } }
最終結(jié)果是隨機(jī)的:
多線程隨機(jī)性原理:
創(chuàng)建多線程程序的第二種方式:實現(xiàn)RunnabLe接口
java.Lang.Runnable
Runnable接口應(yīng)該由那些打算通過某一線程執(zhí)行其實例的類來實現(xiàn)。類必須定義一個稱為run的無參數(shù)方法。
java.Lang.Thread類的構(gòu)造方法
Thread ( Runnable target)分配新的 Thread 對象。
Thread ( Runnable target, string name)分配新的Thread 對象。
實現(xiàn)步驟:
- 創(chuàng)建一個Runnable接口的實現(xiàn)類
- 在實現(xiàn)類中重寫Runnable接口的run方法,設(shè)置線程任務(wù)
- 創(chuàng)建一個Runnable接口的實現(xiàn)類對象
- 創(chuàng)建Thread類對象,構(gòu)造方法中傳遞Runnable接口的實現(xiàn)類對象
- 調(diào)用Thread類中的start方法,開啟新的線程執(zhí)行run方法
public class threadex2 implements Runnable{ @Override public void run() { for (int i = 0; i < 20; i++) { System.out.println(Thread.currentThread().getName()+i); } } }
public class thread { public static void main(String[] args) { //第二種 threadex2 mt1=new threadex2(); Thread t=new Thread(mt1); t.start(); for (int i = 0; i < 20; i++) { System.out.println(Thread.currentThread().getName()+i); } } }
結(jié)果同樣是隨機(jī)的:
實現(xiàn)Runnable接口創(chuàng)建多線程程序的好處:
1.避免了單繼承的局限性
一個類只能繼承一個類(一個人只能有一個親爹),類繼承了Thread類就不能繼承其他的類實現(xiàn)了Runnable接口,還可以繼承其他的類,實現(xiàn)其他的接口
2.增強(qiáng)了程序的擴(kuò)展性,降低了程序的耦合性(解耦)
實現(xiàn)Runnable接口的方式,把設(shè)置線程任務(wù)和開啟新線程進(jìn)行了分離(解耦)實現(xiàn)類中,重寫了run方法:用來設(shè)置線程任務(wù)
創(chuàng)建Thread類對象,調(diào)用start方法:用來開啟新線程
匿名內(nèi)部類方式實現(xiàn)線程的創(chuàng)建
匿名:沒有名字
內(nèi)部類:寫在其他類內(nèi)部的類
匿名內(nèi)部類作用:簡化代碼
把子類繼承父類,重寫父類的方法,創(chuàng)建子類對象合一步完成
把實現(xiàn)類實現(xiàn)接口,重寫接口中的方法,創(chuàng)建實現(xiàn)類對象合成一步完成
匿名內(nèi)部類的最終產(chǎn)物:子類/實現(xiàn)類對象,而這個類沒有名字
格式:
new 父類/接口 () {
重復(fù)父類/接口中的方法
};
public static void main(String[] args) { new Thread(){ public void run(){ for (int i = 0; i < 20; i++) { System.out.println(Thread.currentThread().getName()+"cs"+i); } } }.start();//Thread-0 //線程的接口Runnable //Runnable r=new RunnableImpl();//多態(tài) Runnable r=new Runnable(){ //重寫run方法,設(shè)置線程任務(wù) public void run(){ for (int i = 0; i < 20; i++) { System.out.println(Thread.currentThread().getName()+"ff"+i); } } }; new Thread(r).start(); //簡化 new Thread(new Runnable(){ //重寫run方法,設(shè)置線程任務(wù) public void run(){ for (int i = 0; i < 20; i++) { System.out.println(Thread.currentThread().getName()+"hj"+i); } } }).start(); }
Thread類中的常用方法:
獲取線程的名稱:
1.使用Thread類中的方法getName() String getName() 返回該線程的名稱。
2.可以先獲取到當(dāng)前正在執(zhí)行的線程,使用線程中的方法getName()獲取線程的名稱
static Thread currentThread()返回對當(dāng)前正在執(zhí)行的線程對象的引用。
//方法一 public class threadfun extends Thread{ public void run(){ String name = getName(); System.out.println(name); } }
/* 線程的名稱: 主線程: main 新線程:Thread-0, Thread-1 , Thread-2 */ public class threadfunmain { public static void main(String[] args) { threadfun mt = new threadfun(); mt.start();//Thread-0 new threadfun().start();//Thread-1 new threadfun().start();//Thread-2 } }
方法二: public class threadfun extends Thread{ public void run(){ //方法二 Thread th = Thread.currentThread(); System.out.println(th); String name = getName(); System.out.println(name); //System.out.println(Thread.currentThread().getName()); } }
public class threadfunmain { public static void main(String[] args) { threadfun mt = new threadfun(); mt.start();//Thread[Thread-0,5,main] Thread-0 new threadfun().start();//Thread[Thread-1,5,main] Thread-1 new threadfun().start();//Thread[Thread-2,5,main] Thread-2 System.out.println(Thread.currentThread().getName());//main //主線程中只能用第二種方法獲取,因為測試類沒有繼承Thread類,沒有g(shù)etname方法 } }
設(shè)置線程的名稱:(了解)
1.使用Thread類中的方法setName(名字)
void setName ( String name)改變線程名稱,使之與參數(shù)name相同。
2.創(chuàng)建一個帶參數(shù)的構(gòu)造方法,參數(shù)傳遞線程的名稱;調(diào)用父類的帶參構(gòu)造方法,把線程名稱傳遞給父類,讓父類(Thread)給子線程起一個名字
Thread ( String name)分配新的Thread 對象。
public class threadfun extends Thread{ public void run(){ //設(shè)置線程的名稱方法一 System.out.println(Thread.currentThread().getName()); } //設(shè)置線程的名稱方法二 threadfun(){} threadfun(String name){ super(name); } }
public class threadfunmain { public static void main(String[] args) { threadfun mt = new threadfun(); //設(shè)置線程的名稱方法一 mt.setName("ess"); mt.start(); //設(shè)置線程的名稱方法二 new threadfun("ff").start(); } }
public static void sleep(Long millis):使當(dāng)前正在執(zhí)行的線程以指定的毫秒數(shù)暫停(暫時停止執(zhí)行)。毫秒數(shù)結(jié)束之后,線程繼續(xù)執(zhí)行
//sleep for (int i = 0; i < 20; i++) { System.out.println(i); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }
總結(jié):
這篇文章就到這里了,希望能夠給你帶來幫助,也希望大家能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
springboot前后端分離集成CAS單點登錄(統(tǒng)一認(rèn)證)
單點登錄是一種身份認(rèn)證和授權(quán)技術(shù),允許用戶在多個應(yīng)用系統(tǒng)中使用同一套用戶名和密碼進(jìn)行登錄,本文主要介紹了springboot前后端分離集成CAS單點登錄,具有一定的參考價值,感興趣的可以了解一下2024-09-09Java多線程之JUC(java.util.concurrent)的常見類(多線程編程常用類)
這篇文章主要給大家介紹了關(guān)于Java多線程之JUC(java.util.concurrent)的常見類(多線程編程常用類)的相關(guān)資料,Java中的JUC(java.util.concurrent)包提供了一些并發(fā)編程中常用的類,這些類可以幫助我們更方便地實現(xiàn)多線程編程,需要的朋友可以參考下2024-02-02解決dubbo啟動報服務(wù)注冊失敗Failed?to?register?dubbo
這篇文章主要介紹了解決dubbo啟動報服務(wù)注冊失敗Failed?to?register?dubbo問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12Java生成訂單號或唯一id的高并發(fā)方案(4種方法)
本文主要介紹了Java生成訂單號或唯一id的高并發(fā)方案,包括4種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01SpringCloud Netflix Ribbon超詳細(xì)講解
這篇文章主要介紹了SpringCloud筆記HoxtonNetflix之Ribbon負(fù)載均衡,Ribbon是管理HTTP和TCP服務(wù)客戶端的負(fù)載均衡器,Ribbon具有一系列帶有名稱的客戶端(Named Client),對SpringCloud Ribbon負(fù)載均衡相關(guān)知識感興趣的朋友一起看看吧2022-10-10如何基于springboot-admin實現(xiàn)后臺監(jiān)控
這篇文章主要介紹了如何基于springboot-admin實現(xiàn)后臺監(jiān)控,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04