彩蛋提前播放
超神學院語錄
我與各位并無冤仇,但,我為愛而戰,
執行緒的三種使用方式
- 實作Runnable介面
- 實作Callable介面
- 繼承Thread介面
實作
Runnable和Callable介面的類只能當做一個可以在執行緒中運行的任務,不是真正意義上的執行緒,因此最后還需要通過 Thread 來呼叫,可以說任務是通過執行緒驅動從而執行的,
實作Runnable介面
通過實作Runnable介面使用執行緒,需要先實作Runable介面的run()方法:
public class HelloRunnable implements Runnable {
public void run() {
// 邏輯代碼
}
}
實作Runable介面的類并不是真正的執行緒,需要執行緒物件Thread通過呼叫start() 方法啟動執行緒,
執行緒使用方式如下:
public static void main(String[] args) {
HelloRunnable instance = new HelloRunnable();
Thread thread = new Thread(instance);
thread.start();
}
實作Callable介面
與Runnable介面相比,Callable可以有回傳值,回傳值通過FutureTask進行封裝,
public class HelloCallable implements Callable<Integer> {
public Integer call() {
return 999;
}
}
和Runnable不同,實作Callable的類需要實作call()方法,
使用方式如下:
public static void main(String[] args) throws ExecutionException, InterruptedException {
HelloCallable hc = new HelloCallable();
FutureTask<Integer> ft = new FutureTask<>(hc);
Thread thread = new Thread(ft);
thread.start();
System.out.println(ft.get());
}
繼承Thread類(不推薦)
與 Runnable相似,需要實作run() 方法,實際上Thread類也繼承了Runable介面,
但是不需要宣告執行緒物件去呼叫start方法,因為繼承了Thread類,當呼叫 start() 方法啟動一個執行緒時,虛擬機會將該執行緒放入就緒佇列中等待被調度,當一個執行緒被調度時會執行該執行緒的 run() 方法
宣告執行緒物件:
public class HelloThread extends Thread {
public void run() {
// 邏輯代碼
}
}
使用執行緒物件:
public static void main(String[] args) {
HelloThread ht = new HelloThread ();
ht.start();
}
實作介面與繼承Thread
實作介面更推薦使用,因為:
- Java 不支持多重繼承,因此繼承了 Thread 類就無法繼承其它類,但是可以實作多個介面;
- 類可能只要求可執行就行,繼承整個 Thread 類開銷過大,
Runnable介面與Thread之間的關系:
Thread負責執行緒本身相關的職責與控制,而Runable僅負責邏輯執行的單元,因此繼承Thread開銷會更大一些,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/278851.html
標籤:java

