Java進(jìn)階必備之多線程編程
一、圖示
二、多線程編程
何為多線程,通俗的講就是讓你的代碼同時(shí)干好幾件事。
而我們的一個(gè)代碼文件或者一個(gè)項(xiàng)目就是一個(gè)進(jìn)程,而如果我們想提高效率,我們可以多開幾個(gè)文件進(jìn)行多進(jìn)程,也可以在進(jìn)程中創(chuàng)建多線程(多寫幾個(gè)方法),但是多進(jìn)程比較耗費(fèi)資源,所以一般推薦多線程,在代碼里,讓代碼做幾個(gè)文件做的事。
多線程編程可以讓我們的代碼擁有更高效率。
三、線程的工作過程
猶如上圖
使用多線程需要先創(chuàng)建一個(gè)或者多個(gè)線程
然后讓線程調(diào)用CPU資源,開始運(yùn)行
然后運(yùn)行完畢等待所有線程運(yùn)行完畢
然后刪除資源,結(jié)束線程
Java線程擁有優(yōu)先級
優(yōu)先級就是系統(tǒng)確定線程的調(diào)度順序,但是不執(zhí)行順序,因?yàn)槎嗑€程的執(zhí)行是具有無序性的。
調(diào)度順序只是系統(tǒng)分配資源的順序,不分配資源就無法執(zhí)行。
四、創(chuàng)建多線程
如何在Java代碼中創(chuàng)建多線程,Java內(nèi)置了用于多線程的庫。
1.繼承Thread類,重寫run()方法
我們需要寫一個(gè)類A來繼承Thread類,并重寫run()方法。
run()方法里面放我們需要進(jìn)行多線程的代碼。
然后再在主類中實(shí)例化類A的對象,并且調(diào)用strat方法。
public class TheadText { public static void main(String[] args) { //實(shí)例化StartThread,并調(diào)用start方法使線程動起來 StartThread t1 = new StartThread("一 "); t1.start(); StartThread t2 = new StartThread("二 "); t2.start(); StartThread t3 = new StartThread("三 "); t3.start(); StartThread t4 = new StartThread("四 "); t4.start(); } } /** * 1.繼承Thread類并重寫run方法 */ class StartThread extends Thread{ String name; StartThread(String name){ this.name = name; } @Override public void run() { System.out.println(name+1); System.out.println(name+2); System.out.println(name+3); System.out.println(name+4); System.out.println(name+5); } }
運(yùn)行結(jié)果(還可以體現(xiàn)線程的無序性):
2. 實(shí)現(xiàn)接口Runnable接口,實(shí)現(xiàn)run方法
使用Runnable接口避免了單繼承的局限性,線程類只是實(shí)現(xiàn)了 Runnable 接口,還可以繼承其他類
public class TheadText { public static void main(String[] args) { StartRunnable startRunnable1 = new StartRunnable(" 一 "); Thread te1 = new Thread(startRunnable1); te1.start(); StartRunnable startRunnable2 = new StartRunnable(" 二 "); Thread te2 = new Thread(startRunnable2); te2.start(); StartRunnable startRunnable3 = new StartRunnable(" 三 "); Thread te3 = new Thread(startRunnable3); te3.start(); StartRunnable startRunnable4 = new StartRunnable(" 四 "); Thread te4 = new Thread(startRunnable4); te4.start(); } } /** * 2. 實(shí)現(xiàn)Runnable接口,實(shí)現(xiàn)run方法 */ class StartRunnable implements Runnable{ String name; // 重載一下方法,利于區(qū)分 StartRunnable(String name){ this.name = name; } @Override public void run() { System.out.println(name+1); System.out.println(name+2); System.out.println(name+3); System.out.println(name+4); System.out.println(name+5); } }
運(yùn)行結(jié)果:
3. 實(shí)現(xiàn)Callable接口,實(shí)現(xiàn)call方法
這個(gè)我研究了挺大一會兒。
實(shí)現(xiàn)這個(gè)接口后,還需要實(shí)現(xiàn)call方法
然后通過FutureTask類來對我們實(shí)例化對象進(jìn)行封裝
最后還要實(shí)例化Thread類進(jìn)行start操作開啟我們的線程
代碼演示:
public class TheadText { public static void main(String[] args) { //先實(shí)例化 StartCallable a = new StartCallable(); //然后調(diào)用FutureTask類 FutureTask<String> te1 = new FutureTask<>(a); //設(shè)置我們的name屬性 a.name = " 一 "; //開啟我們的線程一 new Thread(te1).start(); StartCallable b = new StartCallable(); FutureTask<String> te2 = new FutureTask<>(b); b.name = " 二 "; new Thread(te2).start(); StartCallable c = new StartCallable(); FutureTask<String> te3 = new FutureTask<>(c); c.name = " 三 "; new Thread(te3).start(); StartCallable d = new StartCallable(); FutureTask<String> te4 = new FutureTask<>(d); d.name = " 四 "; new Thread(te4).start(); } } /** * 實(shí)現(xiàn)Callable接口,實(shí)現(xiàn)call方法 */ class StartCallable implements Callable<String>{ String name ; public String call() throws Exception{ System.out.println(name+1); System.out.println(name+2); System.out.println(name+3); System.out.println(name+4); return name; } }
運(yùn)行結(jié)果:
線程的生命周期
線程在我們創(chuàng)建后(出生)等待CPU的資源分配,然后開始工作,在工作完我們分配的工作后,就會(死亡)消失
到此這篇關(guān)于Java進(jìn)階必備之多線程編程的文章就介紹到這了,更多相關(guān)Java多線程編程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在已經(jīng)使用mybatis的項(xiàng)目里引入mybatis-plus,結(jié)果不能共存的解決
這篇文章主要介紹了在已經(jīng)使用mybatis的項(xiàng)目里引入mybatis-plus,結(jié)果不能共存的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03使用WebUploader實(shí)現(xiàn)上傳文件功能(一)
這篇文章主要為大家詳細(xì)介紹了使用WebUploader實(shí)現(xiàn)上傳文件功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01SpringBoot集成Lettuce客戶端操作Redis的實(shí)現(xiàn)
本文主要介紹了SpringBoot集成Lettuce客戶端操作Redis的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11java并發(fā)編程StampedLock高性能讀寫鎖詳解
這篇文章主要為大家介紹了java并發(fā)編程StampedLock高性能讀寫鎖的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05