Java 建立執行緒的3種方法及各自的優點
阿新 • • 發佈:2020-07-20
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. 實現 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. 實現 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 後,支援拉姆達表示式的寫法,可以建立一個 FutureTask 類,語句上不是太羅嗦。 Callable 方式有以下幾個優點:
- 可以捕獲執行緒上的異常。
- 可以通過 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 之後,還可以通過建立執行緒池來建立執行緒,使用 ExecutorService 的 execute 方法:
ExecutorService es = Executors.newCachedThreadPool(); Runnable r = <your runnable here>; es.execute(r);
實現Runnable介面相對於繼承Thread類的優勢:
(1) 適合多個相同程式程式碼的執行緒去處理同一資源的情況
(2) 可以避免由於java單一繼承帶來的侷限性
(3) 用介面的方式將你的程式碼和執行緒實現分離,更加清晰。
(4) 通過繼承Thread類,每個執行緒都有一個相關聯的唯一物件,而實現Runnable介面,多執行緒可以共享同一個Runnable例項。
(5) 增強了程式的健壯性,程式碼能夠被多個執行緒共享,程式碼與資料是獨立的。
以上就是Java 建立執行緒的3種方法及各自的優點的詳細內容,更多關於JAVA 建立執行緒的資料請關注我們其它相關文章!