Java原生支持多線程,主要通過以下四種方式實現多線程: 繼承Thread類 實現Runnable介面 實現Callable介面 線程池 繼承Thread類 通過創建Thread類的子類,並重寫run()方法,通過調用start()方法啟動線程。 public class TestThread ex ...
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(); //需要手動關閉線程池服務
}
}
線程池
待編輯...