java多線程開啟的三種方式你知道嗎
1、繼承Thread類,新建一個當(dāng)前類對象,并且運行其start()方法
package com.xiaostudy.thread; /** * @desc 第一種開啟線程的方式 * @author xiaostudy * */ public class Demo1_Thread extends Thread { public void run() { for (int i = 0; i < 10; i++) { System.out.println(i + " run()..."); } } public static void main(String[] args) { Demo1_Thread demo = new Demo1_Thread(); demo.start(); for (int i = 0; i < 10; i++) { System.out.println(i + " main()...");1 } } }
上面這里就是當(dāng)前類的一個線程和main線程一起運行
2、實現(xiàn)Runnable接口,然后新建當(dāng)前類對象,接著新建Thread對象時把當(dāng)前類對象傳進去,最后運行Thread對象的start()方法
package com.xiaostudy.thread; /** * @desc 第二種開啟線程的方式 * @author xiaostudy * */ public class Demo2_Thread implements Runnable { public void run() { for (int i = 0; i < 10; i++) { System.out.println(i + " run()..."); } } public static void main(String[] args) { Demo2_Thread demo = new Demo2_Thread(); Thread thread = new Thread(demo); thread.start(); for (int i = 0; i < 10; i++) { System.out.println(i + " main()..."); } } }
分析:從Thread的有參構(gòu)造方法進去
當(dāng)前類傳進去,進入到Thread的init()方法
再跟進去
下面截圖問題,分開兩個,看行號。就把當(dāng)前類賦值給了Thread的target屬性
再回過頭來看Thread對象的run()方法,因為當(dāng)Thread對象的start()方法調(diào)用時,是執(zhí)行Thread對象的run()方法(這里就不深入分析)
這里的target的值就是當(dāng)前類對象,所以最后還是執(zhí)行了當(dāng)前類對象的run()方法
3、實現(xiàn)Callable接口,新建當(dāng)前類對象,在新建FutureTask類對象時傳入當(dāng)前類對象,接著新建Thread類對象時傳入FutureTask類對象,最后運行Thread對象的start()方法
package com.xiaostudy.thread; import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; /** * @desc 第三種開啟線程的方式 * @author xiaostudy * */ public class Demo3_Thread implements Callable { public static void main(String[] args) { Callable callable = new Demo3_Thread(); FutureTask futureTask = new FutureTask(callable); Thread thread = new Thread(futureTask); thread.start(); for (int i = 0; i < 10; i++) { System.out.println(i + " main()..."); } } public Object call() throws Exception { for (int i = 0; i < 10; i++) { System.out.println(i + " call()..."); } return null; } } Demo3_Thread.java
分析:同樣從Thread的有參構(gòu)造方法進去
同樣也是跟第二種方法一樣
那么,就看Runnable接口和FutureTask類的關(guān)系。從下面的圖看出FutureTask類是Runnable接口的繼承接口的實現(xiàn)類。
接著看看FutureTask的有參構(gòu)造
從下圖可以看出,F(xiàn)utureTask的有參構(gòu)造,把當(dāng)前類對象傳給了FutureTask的callable屬性
那么當(dāng)Thread執(zhí)行start()方法時,就是執(zhí)行FutureTask的run()方法,從下面圖看到,最后就是執(zhí)行了當(dāng)前類的call()方法
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
spring無法引入注解及import org.springframework.web.bind.annota
本文主要介紹了spring無法引入注解及import org.springframework.web.bind.annotation.*報錯的解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06@Valid注解的作用及@Valid注解與@Validated的區(qū)別
這篇文章主要介紹了@Valid注解的作用及@Valid注解與@Validated的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08通過Maven進行jedis連接redis的實現(xiàn)
這篇文章主要介紹了通過Maven進行jedis連接redis的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07SpringSecurity rememberme功能實現(xiàn)過程解析
這篇文章主要介紹了SpringSecurity rememberme功能實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03POST方法給@RequestBody傳參數(shù)失敗的解決及原因分析
這篇文章主要介紹了POST方法給@RequestBody傳參數(shù)失敗的解決及原因分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10Java從零編寫吃貨聯(lián)盟訂餐系統(tǒng)全程講解
這篇文章主要介紹了Java訂餐系統(tǒng),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-12-12SpringBoot實現(xiàn)發(fā)送郵件任務(wù)
這篇文章主要為大家詳細介紹了SpringBoot實現(xiàn)發(fā)送郵件任務(wù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-02-02