Java原生支持多執行緒,主要通過以下四種方式實作多執行緒:
- 繼承Thread類
- 實作Runnable介面
- 實作Callable介面
- 執行緒池
繼承Thread類
通過創建Thread類的子類,并重寫run()方法,通過呼叫start()方法啟動執行緒,
public class TestThread extends Thread {
@Override
public void run() {
//run方法執行緒體
for (int i = 0; i < 10; i++) {
System.out.println("run方法執行緒體" + i);
}
}
public static void main(String[] args) {
//main執行緒,主執行緒
TestThread testThread = new TestThread();//創建一個執行緒物件
testThread.start();//呼叫start()方法,啟動執行緒
for (int i = 0; i < 10; i++) {
System.out.println("main方法執行緒體" + i);
}
}
}

可以看到兩個執行緒的執行程序是混亂的,這就說明兩個執行緒的執行順序是隨機的,并不是按照呼叫順序來執行的,
但一般不建議使用繼承Thread類的方式實作多執行緒,因為Java是單繼承的,子類繼承Thread類之后,會限制后續擴展,
實作Runnable介面
Thread類就實作了Runnable介面,我們也可以實作Runnable介面并實作run()方法來實作多執行緒,在創建Thread類的時候,將待執行執行緒作為引數傳遞,呼叫start()方法啟動,
//實作Runnable介面,并實作run()方法
public class TestThread3 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("run 方法執行緒: " + i);
}
}
public static void main(String[] args) {
TestThread3 testThread3 = new TestThread3();//創建新執行緒
new Thread(testThread3).start();//創建Thread類,并將待執行執行緒作為引數傳遞進去,呼叫start()方法啟動
for (int i = 0; i < 5; i++) {
System.out.println("main 方法執行緒: " + i);
}
}
}

相比于第一種方案,更推薦使用介面方案,繼承Runnable介面避免了收到單繼承的限制,也方便同一個物件被多個執行緒使用
實作Callable介面
Callable介面類似于Runnable介面,都是為 其實體可能由另一個執行緒執行的類 而設計的, 不過相比于Runnable介面實作多執行緒的方式,實作Callable介面的多執行緒方式可以回傳結果,并可能拋出例外,實作Callable介面并實作call方法,
public class TestCallable implements Callable<Boolean> {
@Override
public Boolean call() throws Exception { //實作call()方法
for (int i = 0; i < 5; i++) {
System.out.println("call 方法執行緒: " + i);
}
return true;
}
public static void main(String[] args) {
TestCallable testCallable = new TestCallable(); //創建新任務
ExecutorService executorService = Executors.newFixedThreadPool(1); //創建執行緒池
Future<Boolean> res = executorService.submit(testCallable); //將任務提交到執行緒池
for (int i = 0; i < 5; i++) {
System.out.println("main 方法執行緒: " + i);
}
executorService.shutdown(); //需要手動關閉執行緒池服務
}
}
執行緒池
待編輯...
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/549278.html
標籤:其他
上一篇:逍遙自在學C語言 | 邏輯運算子

