Java都有哪些創(chuàng)建線程的方法
在 Java 中,線程的創(chuàng)建方法有 7 種,分為以下 3 大類:
- 繼承 Thread 類的方式,它有 2 種實(shí)現(xiàn)方法。
- 實(shí)現(xiàn) Runnable 接口的方式,它有 3 種實(shí)現(xiàn)方法。
- 實(shí)現(xiàn) Callable 接口的方式,它有 2 種實(shí)現(xiàn)方法。
1.繼承Thread類
繼承 Thread 類并重寫 run 方法,是最早期創(chuàng)建線程的方法,它的實(shí)現(xiàn)方法有以下兩種:
- 創(chuàng)建一個(gè)普通的類,繼承 Thread 類,并重寫 run 方法。
- 使用匿名內(nèi)部類的方式繼承并重寫 run 方法。
具體實(shí)現(xiàn)如下。
1.1 普通類繼承Thread
創(chuàng)建一個(gè)普通類,繼承 Thread 并重寫 run 方法,其中 run 方法中的代碼是線程具體要執(zhí)行的業(yè)務(wù)代碼,實(shí)現(xiàn)如下:
// 自定義一個(gè)類繼承 Thread 并重寫 run 方法
class MyThread extends Thread {
@Override
public void run() {
// 添加業(yè)務(wù)方法...
}
}
// 創(chuàng)建線程并執(zhí)行
public class ThreadExample {
public static void main(String[] args) {
// 創(chuàng)建線程
Thread thread = new MyThread();
// 啟動(dòng)線程
thread.start();
}
}1.2 匿名內(nèi)部類
上面的寫法有點(diǎn)繁瑣,我們還可以使用以下匿名類的方式來實(shí)現(xiàn):
// 匿名方式創(chuàng)建線程
Thread t1 = new Thread() {
@Override
public void run() {
// 添加業(yè)務(wù)方法...
}
};
// 啟動(dòng)線程
t1.start();1.3 缺點(diǎn)分析
繼承 Thread 類的實(shí)現(xiàn)方法有一個(gè)明顯的缺點(diǎn),Java 語言是單繼承的,所以如果繼承了 Thread 類,那就不能再繼承其他類了。
2.實(shí)現(xiàn)Runnable接口
在 Java 語言中,雖然不能多繼承,但可以實(shí)現(xiàn)多個(gè)接口。接下來是實(shí)現(xiàn) Runnable 接口的 3 種方法:
- 創(chuàng)建一個(gè)普通類實(shí)現(xiàn) Runnable 接口,并重寫 run 方法。
- 使用匿名方式創(chuàng)建 Runnable 實(shí)現(xiàn)類,并重寫 run 方法。
- 使用 Lambda 方式創(chuàng)建匿名 Runnable 實(shí)現(xiàn)類(JDK 8+)。
2.1 普通類實(shí)現(xiàn)Runnable
// 定義一個(gè)普通類實(shí)現(xiàn) Runnable 接口
class MyRunnable implements Runnable {
@Override
public void run() {
// 添加業(yè)務(wù)方法...
}
}
// 線程創(chuàng)建
public static void main(String[] args) {
// 創(chuàng)建一個(gè) Runnable 實(shí)現(xiàn)類
MyRunnable myRunnable = new MyRunnable();
// 創(chuàng)建線程
Thread thread = new Thread(myRunnable);
// 啟動(dòng)線程
thread.start();
}2.2 匿名Runnable實(shí)現(xiàn)類
// 匿名 Runnable 實(shí)現(xiàn)類
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
// 添加業(yè)務(wù)方法...
}
});
// 啟動(dòng)線程
t2.start();2.3 Lambda創(chuàng)建Runnable
在 JDK 8 之后(包含 JDK 8),我們可以使用 Lambda 表達(dá)式來創(chuàng)建線程,如下代碼所示:
// 使用 Lambda 匿名 Runnable 方式
Thread t3 = new Thread(() -> {
// 添加業(yè)務(wù)方法...
});
// 啟動(dòng)線程
t3.start();從上述代碼可以看出,如果是 JDK 1.8 以上的程序,在不要求獲得線程執(zhí)行結(jié)果的情況下,推薦使用 Lambda 的方式來創(chuàng)建線程,因?yàn)樗膶懛ㄗ銐蚝?jiǎn)潔。
2.4 缺點(diǎn)分析
以上創(chuàng)建線程的方法,都有一個(gè)通用的問題:那就是不能獲得線程的執(zhí)行結(jié)果。
3.使用Callable接口
JDK 1.5 中推出的 Callable 接口,解決了之前不能獲得線程執(zhí)行結(jié)果的尷尬,它的實(shí)現(xiàn)方法有以下兩種:
- 創(chuàng)建一個(gè)普通類實(shí)現(xiàn) Callable 接口,并重寫 call 方法。
- 使用匿名內(nèi)部類創(chuàng)建 Callable 的實(shí)現(xiàn)類,并重寫 call 方法。
3.1 普通類實(shí)現(xiàn)Callable
// 定義普通實(shí)現(xiàn) Callable 接口,返回一個(gè) Integer 類型的結(jié)果(當(dāng)然也可以返回其他類型的結(jié)果)
class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
// 業(yè)務(wù)實(shí)現(xiàn)代碼...
return 0;
}
}
// 創(chuàng)建線程
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 創(chuàng)建 Callable 普通類
MyCallable callable = new MyCallable();
// 使用 FutureTask 用于獲取線程執(zhí)行結(jié)果
FutureTask<Integer> futureTask = new FutureTask<>(callable);
// 創(chuàng)建線程
Thread thread = new Thread(futureTask);
// 啟動(dòng)線程
thread.start();
// 得到線程執(zhí)行的結(jié)果
int result = futureTask.get();
}以上代碼使用 FutureTask + Callable 的方式獲取線程的執(zhí)行結(jié)果,它可以接受任何類型的返回值,我們只需要在創(chuàng)建 Callable 實(shí)現(xiàn)類的時(shí)候,定義返回的數(shù)據(jù)類型即可。
3.2 匿名Callable實(shí)現(xiàn)類
// FutureTask 用于獲取線程執(zhí)行結(jié)果
FutureTask<Integer> futureTask = new FutureTask<>(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
// 業(yè)務(wù)代碼...
return 0;
}
});
// 創(chuàng)建線程
Thread thread = new Thread(futureTask);
// 啟動(dòng)線程
thread.start();
// 得到線程執(zhí)行的結(jié)果
int result = futureTask.get();總結(jié)
在 Java 語言中,創(chuàng)建線程有 3 大類實(shí)現(xiàn)方式、7 種實(shí)現(xiàn)方法,如果是 JDK 1.8 以上版本,在不需要獲得線程執(zhí)行結(jié)果的情況下,推薦使用 Lambda 方式來創(chuàng)建線程,因?yàn)樗膶懛ㄗ銐蚝?jiǎn)潔;如果想要獲取線程執(zhí)行結(jié)果,可使用 FutureTask + Callable 的方式來實(shí)現(xiàn)。?
到此這篇關(guān)于Java都有哪些創(chuàng)建線程的方法的文章就介紹到這了,更多相關(guān)Java創(chuàng)建線程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中s.charAt(index)用于提取字符串s中的特定字符操作
這篇文章主要介紹了Java中s.charAt(index)用于提取字符串s中的特定字符操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-10-10
java實(shí)現(xiàn)簡(jiǎn)單圖書管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
springboot使用定時(shí)器@Scheduled不管用的解決
這篇文章主要介紹了springboot使用定時(shí)器@Scheduled不管用的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12

