1. 程式人生 > 程式設計 >Java執行緒池用法實戰案例分析

Java執行緒池用法實戰案例分析

本文例項講述了Java執行緒池用法。分享給大家供大家參考,具體如下:

一 使用newSingleThreadExecutor建立一個只包含一個執行緒的執行緒池

1 程式碼

import java.util.concurrent.*;
public class executorDemo
{
  public static void main( String[] args )
  {    
    ExecutorService executor = Executors.newSingleThreadExecutor();
    executor.submit(() -> {
      String threadName = Thread.currentThread().getName();
      System.out.println("Hello " + threadName);
    }); 
  }
}

2 執行

Hello pool-1-thread-1

二 含有終止方法的執行緒池

1 程式碼

import java.util.concurrent.*;
public class executorShutdownDemo {
  public static void main( String[] args ) {
    ExecutorService executor = Executors.newSingleThreadExecutor();
    executor.submit(() -> {
      String threadName = Thread.currentThread().getName();
      System.out.println("Hello " + threadName);
    });
    try {
      TimeUnit.SECONDS.sleep(3);
      System.out.println("嘗試關閉執行緒執行器...");
      executor.shutdown();
      executor.awaitTermination(5,TimeUnit.SECONDS);
    } catch (InterruptedException e) {
      System.err.println("關閉任務被中斷!");
    } finally {
      if (!executor.isTerminated()) {
        System.err.println("取消未完成的任務");
        executor.shutdownNow();
      }
      System.out.println("任務關閉完成");
    }
  }
}

2 執行

Hello pool-1-thread-1
嘗試關閉執行緒執行器...
任務關閉完成

3 說明

shutdown只是將執行緒池的狀態設定為SHUTWDOWN狀態,正在執行的任務會繼續執行下去,沒有被執行的則中斷。

shutdownNow則是將執行緒池的狀態設定為STOP,正在執行的任務則被停止,沒被執行任務的則返回。

舉個工人吃包子的例子:一個廠的工人(Workers)正在吃包子(可以理解為任務)。

假如接到shutdown的命令,那麼這個廠的工人們則會把手頭上的包子給吃完,沒有拿到手裡的籠子裡面的包子則不能吃!

而如果接到shutdownNow的命令以後呢,這些工人們立刻停止吃包子,會把手頭上沒吃完的包子放下,更別提籠子裡的包子了。

awaitTermination(long timeOut,TimeUnit unit)

當前執行緒阻塞,直到

  • 等所有已提交的任務(包括正在跑的和佇列中等待的)執行完
  • 或者等超時時間到
  • 或者執行緒被中斷,丟擲InterruptedException

然後返回true。

更多java相關內容感興趣的讀者可檢視本站專題:《Java程序與執行緒操作技巧總結》、《Java資料結構與演算法教程》、《Java操作DOM節點技巧總結》、《Java檔案與目錄操作技巧彙總》和《Java快取操作技巧彙總》

希望本文所述對大家java程式設計有所幫助。