文章目錄
- 繼承 Thread
- 實作
- 原始碼分析
- 實作 Runnable
- 實作
- 原始碼分析
- 實作 Callable
- 實作
- 原始碼分析

嗨,好長時間沒跟大家見面啦,總算挑出點時間寫文章了,寫一下多執行緒吧,后面還會繼續更新,文章內容若有問題請指出,萬分感謝!好啦,下面就開始今天的課程吧!
繼承 Thread
實作
class MyThread extends Thread{
@Override
public void run() {
System.out.println("我繼承了Thread類");
}
}
public static void main(String[] args) {
MyThread thread1 = new MyThread();
thread1.start();
}
運行結果:

原始碼分析
Thread 原始碼
通過創建物件,去初始化一個執行緒,但它此時并沒有啟動,

Thread 原始碼
實作了 Runnable 介面,但是我們要記住一點,Runnable 它只是一個介面,它并不能去操作一個執行緒,當然也就不能去啟動執行緒了,


實作 Runnable
實作
class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println("我實作了Runnable介面");
}
}
public static void main(String[] args) {
Thread thread2 = new Thread(new MyRunnable());
thread2.start();
}
運行結果:

原始碼分析
Runnable 原始碼
run 方法是一個抽象方法,它的作用是用來執行執行緒執行邏輯的,所以需要執行緒做什么,我們可以在這里面寫,

Thread 原始碼
接收一個 Runnable 介面物件從而完成執行緒初始化


實作 Callable
實作
class MyCallable implements Callable<String>{
@Override
public String call() throws Exception {
System.out.println("我實作了Callable介面");
return "執行完畢";
}
}
public static void main(String[] args) {
FutureTask<String> futureTask = new FutureTask<String>(new MyCallable());
Thread thread3 = new Thread(futureTask);
thread3.start();
try {
System.out.println("Callable 執行緒的回傳結果:" + futureTask.get());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
運行結果:

原始碼分析
(1)Callable 介面是一個泛型介面,所以在實作的時候需要指定它的型別
(2) call() 方法是有回傳值的

然后我們再去查看一下 Thread 原始碼,并找不到關于 Callable 的任何資訊,那我們怎么去啟動執行緒呢?這時候就出現了 FutureTask
FutureTask 原始碼
可以發現 public FutureTask(Callable callable) 接收一個 Callable 物件

然后我們又發現 FutureTask 實作了 RunnableFuture

接著跟蹤 RunnableFuture
RunnableFuture 原始碼
發現 RunnableFuture 也是實作了 Runnable 介面,這下終于明白為什么 Callable 介面也能實作啟動執行緒了吧!

講到這,還沒完,請大家看一下黃色箭頭所指的地方,它是一個逗號,這是什么意思呢?
答:其實這就是Java中的多實作,大家肯定都知道Java 不支持多繼承,但它卻可以多實作介面,所以這里用逗號來隔開,
好啦,那么本期就講到這里,如果有小伙伴喜歡請關注我,多執行緒及更多精彩內容,將會持續更新,下期見~

上一篇:Java 多執行緒《I》— 并發、并行、執行緒、多執行緒、行程
下一篇:制作中
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/297824.html
標籤:java
上一篇:深度剖析—繼承和多型
