1. 程式人生 > >concurrent包與執行緒池

concurrent包與執行緒池

1.繼承體系

starUML執行異常,和c盤儲存或目錄層次有關

2.API說明和經典例子

以下文字摘自Executor介面的Java API文件:

。此介面提供一種將任務提交與每個任務將如何執行的機制(包括執行緒使用的細節、排程等)分離開來的方法。通常使用Executor 而不是顯式地建立執行緒。例如,可能會使用以下方法,而不是為一組任務中的每個任務呼叫 new Thread(new(RunnableTask())).start()

 Executor executor = anExecutor;
 executor.execute(new RunnableTask1());
 executor.execute(new RunnableTask2());
 ...
 
不過,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); } } }
此包中提供的 Executor 實現實現了。ThreadPoolExecutor 類提供一個可擴充套件的執行緒池實現。Executors 類為這些 Executor 提供了便捷的工廠方法。

記憶體一致性效果:執行緒中將 Runnable 物件提交到 Executor 之前的操作 happen-before 其執行開始(可能在另一個執行緒中)。

從以下版本開始:
1.5

以下文字摘自ExecutorService的Java API文件:

Executor 提供了管理終止的方法,以及可為跟蹤一個或多個非同步任務執行狀況而 的方法。

可以關閉 ExecutorService,這將導致其拒絕新任務。提供兩個方法來關閉 ExecutorService。在終止前允許執行以前提交的任務,而阻止等待任務啟動並試圖停止當前正在執行的任務。在終止時,執行程式沒有任務在執行,也沒有任務在等待執行,並且無法提交新任務。應該關閉未使用的ExecutorService 以允許回收其資源。

通過建立並返回一個可用於取消執行和/或等待完成的 Future方法 submit 擴充套件了基本方法 Executor.execute(java.lang.Runnable)方法 invokeAnyinvokeAll 是批量執行的最常用形式,它們執行任務 collection,然後等待至少一個,或全部任務完成(可使用 ExecutorCompletionService 類來編寫這些方法的自定義變體)。

提供了用於此包中所提供的執行程式服務工廠方法

用法示例

下面給出了一個網路服務的簡單結構,這裡執行緒池中的執行緒作為傳入的請求。它使用了:
 class NetworkService implements Runnable {
    private final ServerSocket serverSocket;
    private final ExecutorService pool;

    public NetworkService(int port, int poolSize)
        throws IOException {
      serverSocket = new ServerSocket(port);
      pool = Executors.newFixedThreadPool(poolSize);
    }
 
    public void run() { // run the service
      try {
        for (;;) {
          pool.execute(new Handler(serverSocket.accept()));
        }
      } catch (IOException ex) {
        pool.shutdown();
      }
    }
  }

  class Handler implements Runnable {
    private final Socket socket;
    Handler(Socket socket) { this.socket = socket; }
    public void run() {
      // read and service request on socket
    }
 }

3.具體知識點與簡單例子

以下是ExecutorService啟動多執行緒執行任務的最簡單用法,摘自Java程式設計思想:

不同的執行緒池: