1. 程式人生 > >Java 執行緒池 四種建立方式

Java 執行緒池 四種建立方式

Java通過Executors提供四種執行緒池,分別為: newCachedThreadPool建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒執行緒,若無可回收,則新建執行緒。 newFixedThreadPool 建立一個定長執行緒池,可控制執行緒最大併發數,超出的執行緒會在佇列中等待。 newScheduledThreadPool 建立一個定長執行緒池,支援定時及週期性任務執行。

newSingleThreadExecutor 建立一個單執行緒化的執行緒池,它只會用唯一的工作執行緒來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先順序)執行。

newCachedThreadPool

  1. public static void main(String[] args) {
  2. ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
  3. for (int i = 0; i < 10; i++) {
  4. final int index = i;
  5. try {
  6. Thread.sleep(10);
  7. } catch (InterruptedException e) {
  8. e.printStackTrace();
  9. }
  10. cachedThreadPool.execute(new Runnable() {
  11. public void run() {
  12. System.out.println(index);
  13. }
  14. });
  15. }
  16. }
建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒執行緒,若無可回收,則新建執行緒。

這裡的執行緒池是無限大的,當一個執行緒完成任務之後,這個執行緒可以接下來完成將要分配的任務,而不是建立一個新的執行緒,

java api 1.7 will reuse previously constructed threads when they are available.

newFixedThreadPool 

  1. public static void main(String[] args) {
  2. ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
  3. for (int i = 0; i < 10; i++) {
  4. final int index = i;
  5. fixedThreadPool.execute(new Runnable() {
  6. public void run() {
  7. try {
  8. System.out.println(index);
  9. Thread.sleep(10);
  10. } catch (InterruptedException e) {
  11. e.printStackTrace();
  12. }
  13. }
  14. });
  15. }
  16. }

建立一個定長執行緒池,可控制執行緒最大併發數,超出的執行緒會在佇列中等待

定長執行緒池的大小最好根據系統資源進行設定。如Runtime.getRuntime().availableProcessors()

  1. public static void main(String[] args) {
  2. ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
  3. for (int i = 0; i < 10; i++) {
  4. scheduledThreadPool.schedule(new Runnable() {
  5. public void run() {
  6. System.out.println("delay 3 seconds");
  7. }
  8. }, 3, TimeUnit.SECONDS);
  9. }
  10. }

newSingleThreadExecutor 

  1. public static void main(String[] args) {
  2. ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
  3. for (int i = 0; i < 10; i++) {
  4. final int index = i;
  5. singleThreadExecutor.execute(new Runnable() {
  6. public void run() {
  7. /* System.out.println(index);*/
  8. try {
  9. System.out.println(index);
  10. Thread.sleep(2000);
  11. } catch (InterruptedException e) {
  12. e.printStackTrace();
  13. }
  14. }
  15. });
  16. }
  17. }
按順序來執行執行緒任務   但是不同於單執行緒,這個執行緒池只是只能存在一個執行緒,這個執行緒死後另外一個執行緒會補上