Java基礎學習——多線程之創建任務
阿新 • • 發佈:2018-12-07
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 // 變量 3private 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 }
需要註意以下幾點:
- Thread類其實是一個實現了Runnable接口的類,所以二者其實沒什麽區別。
- 雖然二者都提供了run()方法但是並不應該執行該方法,Thread類中實現了start()方法來啟動,自己實現Runnable接口的類則需要手動添加該方法,或者是使用 new Thread(new MyRunnable()) 的方法執行。
- 實現Runnable接口的優勢有兩個,一是可以繼承其他類,二是可以用lambda表達式構建匿名類簡化代碼。
- 之前提到線程池,可以用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基礎學習——多線程之創建任務