java多線程開啟的三種方式你知道嗎
1、繼承Thread類,新建一個當前類對象,并且運行其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 }
}
}

上面這里就是當前類的一個線程和main線程一起運行
2、實現(xiàn)Runnable接口,然后新建當前類對象,接著新建Thread對象時把當前類對象傳進去,最后運行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)造方法進去

當前類傳進去,進入到Thread的init()方法

再跟進去

下面截圖問題,分開兩個,看行號。就把當前類賦值給了Thread的target屬性


再回過頭來看Thread對象的run()方法,因為當Thread對象的start()方法調(diào)用時,是執(zhí)行Thread對象的run()方法(這里就不深入分析)

這里的target的值就是當前類對象,所以最后還是執(zhí)行了當前類對象的run()方法

3、實現(xiàn)Callable接口,新建當前類對象,在新建FutureTask類對象時傳入當前類對象,接著新建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)造,把當前類對象傳給了FutureTask的callable屬性

那么當Thread執(zhí)行start()方法時,就是執(zhí)行FutureTask的run()方法,從下面圖看到,最后就是執(zhí)行了當前類的call()方法


總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
SpringBoot獲取yml和properties配置文件的內(nèi)容
這篇文章主要為大家詳細介紹了SpringBoot獲取yml和properties配置文件的內(nèi)容,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04
Java中使用fileupload組件實現(xiàn)文件上傳功能的實例代碼
這篇文章主要介紹了Java中使用fileupload組件實現(xiàn)文件上傳功能的實例代碼,需要的朋友可以參考下2017-05-05
SpringBoot整合Guava Cache實現(xiàn)全局緩存的示例代碼
這篇文章主要介紹了SpringBoot整合Guava Cache實現(xiàn)全局緩存,Guava Cache是Google Guava庫中的一個模塊,提供了基于內(nèi)存的本地緩存實現(xiàn),文中介紹了SpringBoot整合使用Guava Cache的具體步驟,需要的朋友可以參考下2024-03-03
Spring?Boot?@Autowired?@Resource屬性賦值時機探究
這篇文章主要為大家介紹了Spring?Boot?@Autowired?@Resource屬性賦值時機,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07

