1. 程式人生 > >Java基礎學習——多線程之創建任務

Java基礎學習——多線程之創建任務

exce ride ret 必須 cep java基礎學習 start tar 使用

這次來盤點一下Java中用線程執行任務的寫法。

1.擴展Thread

最基本的實現方法是在創建一個繼承Thread的新類,在其中覆蓋run()方法執行任務。

 1 public class MyThread extends Thread {
 2     // 變量
 3     private String name = "";
4 // 構造函數 5 public MyThread() {} 6 public MyThread(String name) { 7 this.name = name; 8 }
9 // run方法中執行任務
10 @Override 11 public void run() { 12 System.out.println("這個線程的名字是" + name); 13 } 14 }

new一個新的線程後,使用start()方法將其變為可運行(Runnable)狀態,隨後會根據系統調度執行或中斷。另外,正在執行的線程也處在可運行狀態。

2.無返回值線程

如果執行的任務沒有返回值,可以讓自己的線程類實現Runnable接口。

 1 public class MyRunnable implements Runnable {
 2     // 變量
 3
private String name = ""; 4 // 構造函數 5 public MyThread() {} 6 public MyThread(String name) { 7 this.name = name; 8 } 9 // run方法中執行任務 10 @Override 11 public void run() { 12 System.out.println("這個線程的名字是" + name); 13 } 14 }

需要註意以下幾點:

  1. Thread類其實是一個實現了Runnable接口的類,所以二者其實沒什麽區別。
  2. 雖然二者都提供了run()方法但是並不應該執行該方法,Thread類中實現了start()方法來啟動,自己實現Runnable接口的類則需要手動添加該方法,或者是使用 new Thread(new MyRunnable()) 的方法執行。
  3. 實現Runnable接口的優勢有兩個,一是可以繼承其他類,二是可以用lambda表達式構建匿名類簡化代碼。
  4. 之前提到線程池,可以用execute(Runnable runnable)執行線程,所以用這種方法會好一點。

3.帶返回值線程

實現Runnable接口的方法沒有返回值,而且不會拋出受查異常。如果有這些需求,需要實現Callable<T>接口。

 1 public class MyCallable implements Callable<String> {
 2     // 變量
 3     private String name = "";
 4     // 構造函數
 5     public MyCallable() { }
 6     public MyCallable(String name) {
 7         this.name = name;
 8     }
 9     // call方法中執行任務
10     @Override
11     public String call() throws Exception {
12         System.out.println(name);
13         return name;
14     }
15 }

Callable<T>接口帶有T類型的返回值,實現了該接口的類必須覆蓋call()方法,這個方法可以拋出異常。

實現了Callable<T>接口的線程類需要先用 FutureTask<T> result = new FutureTask<>(new MyCallable()) 創建一個對象,用 new Thread(result).start() 執行完畢後可以用result.get()獲取T類型的返回值。

在線程池中,用submit(Callable<T> callable)執行此類線程。

Java基礎學習——多線程之創建任務