日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Executor源码解读

發布時間:2025/3/11 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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源码解读的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。