Java 創(chuàng)建線程的3種方法及各自的優(yōu)點
1. 繼承 Thread 類,然后調用 start 方法。
class MyThread extends Thread {
//重寫run方法,線程運行后,跑的就是run方法
public void run(){
//System.out.println("");
}
public static void main(String[] args){
Thread t1 = new MyThread();
t1.start(); //線程運行,調用的 run()方法.
}
}
2. 實現(xiàn) Runnable 接口的 run 方法, 然后再用 Thread 類包裹后,調用 start 方法。
class TestThread implements Runnable{
@Override
public void run() {
// implement run method here
//System.out.println("");
}
public static void main() {
final TestThread obj = new TestThread();
Thread t1 = new Thread(obj);
t1.start();
}
}
3. 實現(xiàn) Callable 接口的 call 方法,用 FutureTask 類包裹 Callable 對象。然后再用 Thread 類包裹 FutureTask 類,并調用 start 方法。call() 方法可以有返回值。
class MyCallable implements Callable {
@Override
public Integer call() throws Exception {
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
return sum;
}
public static void main(String[] args) throws Exception {
MyCallable mc = new MyCallable(); //實例化 callable
FutureTask oneTask = new FutureTask(mc); //用FutureTask包裹
Thread oneThread = new Thread(oneTask); //用Thread包裹
oneThread.start();
System.out.print(oneTask.get()); //獲取返回值
}
}
Callable 方法在 Java 8 后,支持拉姆達表達式的寫法,可以創(chuàng)建一個 FutureTask 類,語句上不是太羅嗦。 Callable 方式有以下幾個優(yōu)點:
- 可以捕獲線程上的異常。
- 可以通過 get 方法得到返回值。
- get 方法阻塞當前線程,直到調用的線程運行結束。
- 可以取消線程的運行。
下面代碼演示了使用 FutureTask 類運行線程,捕獲異常的例子:
FutureTask<Integer> task=new FutureTask<Integer>(()->{
throw new Exception("自定義異常");
});
new Thread(task).start();
try {
System.out.println(task.get());
} catch (Exception e) {
System.out.println(e.getMessage());
}
Java 6 之后,還可以通過創(chuàng)建線程池來創(chuàng)建線程,使用 ExecutorService 的 execute 方法:
ExecutorService es = Executors.newCachedThreadPool(); Runnable r = <your runnable here>; es.execute(r);
實現(xiàn)Runnable接口相對于繼承Thread類的優(yōu)勢:
(1) 適合多個相同程序代碼的線程去處理同一資源的情況
(2) 可以避免由于java單一繼承帶來的局限性
(3) 用接口的方式將你的代碼和線程實現(xiàn)分離,更加清晰。
(4) 通過繼承Thread類,每個線程都有一個相關聯(lián)的唯一對象,而實現(xiàn)Runnable接口,多線程可以共享同一個Runnable實例。
(5) 增強了程序的健壯性,代碼能夠被多個線程共享,代碼與數(shù)據(jù)是獨立的。
以上就是Java 創(chuàng)建線程的3種方法及各自的優(yōu)點的詳細內容,更多關于JAVA 創(chuàng)建線程的資料請關注腳本之家其它相關文章!
相關文章
SpringBoot解析@Value注解型解析注入時機及原理分析
@Value注解可以用來將外部的值動態(tài)注入到Bean中,可以獲取配置文件中的屬性值和通過SpEl表達式獲取bean的屬性或方法2024-12-12
Springboot整合mybatis-plus使用pageHelper進行分頁(使用步驟)
PageHelper是一個MyBatis分頁插件,可以方便地實現(xiàn)數(shù)據(jù)庫查詢結果的分頁功能,在Maven或Gradle項目中引入依賴,并在配置文件中進行配置,本文給大家介紹Springboot整合mybatis-plus使用pageHelper進行分頁,感興趣的朋友跟隨小編一起看看吧2024-11-11
Mybatis-plus?代碼生成器?AutoGenerator?的簡介和使用詳解
AutoGenerator是MyBatis-Plus的代碼生成器,通過AutoGenerator可以快速生成?Entity、Mapper、Mapper XML、Service、Controller等各個模塊的代碼,極大的提升了開發(fā)效率,這篇文章主要介紹了Mybatis-plus代碼生成器AutoGenerator的簡介和使用,需要的朋友可以參考下2023-05-05
SpringBoot如何訪問不同的數(shù)據(jù)庫的方法實現(xiàn)
本文主要介紹了在SpringBoot應用中配置和管理多個數(shù)據(jù)源的方法,包括使用SpringBoot官方支持的配置方式和第三方庫實現(xiàn)多數(shù)據(jù)源配置,感興趣的可以了解一下2024-11-11
Java中用Mybatis插入mysql報主鍵重復的解決方案
這篇文章主要介紹了Java中用Mybatis插入mysql報主鍵重復的解決方案,具有很好的參考價值,希望對大家有所幫助。2023-02-02

