Executor源码解读
Executor源碼解讀
- 〇、[源碼版本] jdk 1.8
- 一、不再顯式創建線程
- [舉例1]代碼示例
- 二、不嚴格要求執行是異步的
- [舉例1]代碼示例
- 三、任務在調用者線程之外的某個線程中執行
- [舉例1]代碼示例
- 四、施加了某種限制的復合執行器
- [舉例1]代碼示例
- 五、concurrent包中提供的Executor的實現對象
- [舉例1]ExecutorService,這是一個更廣泛的接口。
- [舉例2]ThreadPoolExecutor類,提供了一個可擴展的線程池實現。
- [舉例3]Executors類,為這些類和接口提供了的工廠和實用方法。
- 六、內存一致性影響
- 七、Executor接口只提供了execute方法
- execute方法
〇、[源碼版本] jdk 1.8
一、不再顯式創建線程
Executor接口是執行提交的Runnable任務的對象。這個接口提供了一種方法,將任務提交與每個任務如何運行的機制解耦,包括線程使用、調度等的細節。通常使用Executor而不是顯式創建線程。
[舉例1]代碼示例
為一組任務中的每個調用顯式創建線程的方法:
new Thread(new(RunnableTask())).start()使用Executor方式可以替代顯示創建線程的方法:
Executor executor = <em>anExecutor</em>; executor.execute(new RunnableTask1()); executor.execute(new RunnableTask2());二、不嚴格要求執行是異步的
然而,Executor接口并不嚴格要求執行是異步的。在最簡單的情況下,一個執行器可以立即在調用者的線程中運行提交的任務。
[舉例1]代碼示例
class DirectExecutor implements Executor {public void execute(Runnable r) {r.run();} }三、任務在調用者線程之外的某個線程中執行
更典型的是,任務在調用者線程之外的某個線程中執行。
[舉例1]代碼示例
下面的執行程序為每個任務生成一個新線程 。
class ThreadPerTaskExecutor implements Executor {public void execute(Runnable r) {new Thread(r).start();}}四、施加了某種限制的復合執行器
許多Executor的實現對象,對任務的調度方式和時間施加了某種限制。
[舉例1]代碼示例
下面的執行器將任務的提交序列化到第二個執行器,是復合執行器。
class SerialExecutor implements Executor {final Queue<Runnable> tasks = new ArrayDeque<Runnable>();final Executor executor;Runnable active;SerialExecutor(Executor executor) {this.executor = executor;}public synchronized void execute(final Runnable r) {tasks.offer(new Runnable() {public void run() {try {r.run();} finally {scheduleNext();}}});if (active == null) {scheduleNext();}}protected synchronized void scheduleNext() {if ((active = tasks.poll()) != null) {executor.execute(active);}}}五、concurrent包中提供的Executor的實現對象
concurrent包中提供的Executor的實現對象有:
[舉例1]ExecutorService,這是一個更廣泛的接口。
一個ExecutorService使用可能的幾個線程池中的一個線程池,執行每個提交的任務,通常使用 Executors工廠方法進行配置。
[舉例2]ThreadPoolExecutor類,提供了一個可擴展的線程池實現。
繼承自AbstractExecutorService接口,AbstractExecutorService實現了ExecutorService接口。
線程池解決兩個不同的問題:
a.它們通常在執行大量異步任務時提供改進的性能,因為減少了每個任務的調用開銷。
b.它們提供了一種限制和管理資源的方法,包括線程,在執行任務集合時的消耗。
同時,每個ThreadPoolExecutor還維護一些基本的統計信息,例如已完成任務的數量。
[舉例3]Executors類,為這些類和接口提供了的工廠和實用方法。
在此concurrent包中定義了Executor、ExecutorService、ScheduledExecutorService、ThreadFactory和Callable類。
六、內存一致性影響
內存一致性影響:將Runnable對象提交給Executor之前,線程中的操作,其內存可見性發生在線程的執行開始前,也可能在另一個線程中。
七、Executor接口只提供了execute方法
execute方法
void execute(Runnable command);execute方法:在將來的某個時間執行給定的command命令。命令可以在新線程、池線程或調用線程中執行,具體取決于Executor的實現。
a.參數:runnable類型的任務
b.返回:無
c.異常:
throws RejectedExecutionException
如果參數任務command不能被接受執行
throws NullPointerException
如果參數任務command為null
總結
以上是生活随笔為你收集整理的Executor源码解读的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 创建线程时,需要创建的内容
- 下一篇: LeetCode——1710. 卡车上的