多線程-Executor

定義了執行已提交Runnable任務的對象。該接口提供了一種將任務提交與如何運行每個任務的機制(包括線程使用、調度等細節)解耦的方法。它通常使用預先創建線程而不是創建線程。

例如new Thread(new(RunnableTask())).start() 每次都創建新線程來執行任務。

現在可以使用以下方式來執行任務:

Executor executor = anExecutor;
executor.execute(new RunnableTask1());

然而,Executor接口並不嚴格要求異步執行,在一個簡易測試中,executor 可以在調用者的線程中立即運行提交的任務:

 class DirectExecutor implements Executor {
   public void execute(Runnable r) {
     //直接執行提交者任務
     r.run();
   }
 }

更典型的情況是,任務在調用者的線程之外的某個線程中執行。下面的執行程序爲每個任務生成一個新線程。

 class ThreadPerTaskExecutor implements Executor {
   public void execute(Runnable r) {
     //創建新線程來執行任務
     new Thread(r).start();
   }
 }

許多Executor實現對如何以及何時調度任務施加了某種限制。下面的執行程序將任務的提交序列化到第二個執行程序,演示了複合執行程序。

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);
     }
   }
 }

ExecutorService接口拓展Executor功能,這是一個更廣泛的接口。

ThreadPoolExecutor類提供可擴展的線程池實現。

Executors類提供了方便的工廠方法。

內存一致性效應:在將可運行對象提交給執行程序之前發生的線程操作——在它開始執行之前,可能在另一個線程中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章