---
# System prepended metadata

title: Runnable、Callable、Future、ExecutorService
tags: [ocpjp]

---

# Runnable、Callable、Future、ExecutorService
[參考網頁1](https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/312035/)
[參考網頁2](https://dotblogs.com.tw/grayyin/2016/07/04/113501)
[參考網頁3](https://medium.com/@JamesQI/executorservice-and-thread-pool-4612359b74ae)
:::info
編寫多執行緒程式是為了實作多工的同步執行，從而能夠更好地提高執行速度。一般有三種方法，
**Thread,Runnable,Callable.**
:::

:::warning
### :bulb: Runnable和Callable的區別是，
**(1)Callable規定的方法是call(),Runnable規定的方法是run().**
**(2)Callable在執行後可返回值，而Runnable在執行後不能返回值**
**(3)call方法可以拋出異常，run方法不可以**
**(4)執行Callable會返回Future物件，表示非同步計算的結果。它提供了檢查計算是否完成的方法，以等待計算的完成，並檢索計算的結果。通過Future物件可以瞭解執行情況，可取消執行，還可獲取執行結果。**
:::

:::info
Executor就是Runnable和Callable的排程容器，**Future就是對於具體的Runnable或者Callable任務的執行結果進行取消、查詢是否完成、獲取結果、設定結果操作。**
:::

:::warning
### :bulb:ExecutorService 的四種物件
**newFixThreadPool**：Create 一個 Thread Pool，必須指定 Thread Pool 最多能有幾條 Thread，每當 submit 一個任務（Task）就會 Create 一條 Thread 直到最大的限度。（如果 Thread 因為 Exception 而結束，Thread Pool 會補充一個新的 Thread）

---
**newCachedThreadPool**：Create 一個 Thread Pool，這個 Pool 並無限制最多能容納幾條 Thread，會依據需求去 Create Thread 與 回收 Thread。

---
**newSingleThreadExecutor**：只會有一條 Thread，任務（Task）會依照一定的順序執行（ex：FIFO, LIFO）。（如果 Thread 因為 Exception 而結束，會有一個新的 Thread 取代原本的 Thread）

---
**newScheduledThreadPool**：Create 一個 Thread Pool，必須指定 Thread Pool 最多能有幾條 Thread，支援周期性的任務（ex：每過10 秒執行一次 ）或者延遲性任務（ex：10 秒後執行）。
:::
###### tags: `ocpjp`






