Java多執行緒之進階篇

張一隆發表於2020-09-26


一、執行緒池

提到執行緒執行緒池我們先來說一下執行緒池的好處,執行緒池的有點大概可以概括三點:

  • 重用執行緒池中的執行緒,避免因為執行緒的建立和銷燬所帶來的效能開銷。
  • 能有效控制執行緒池的最大併發數,避免大量執行緒之間因互相搶奪系統資源而導致的阻塞現象。
  • 能夠對執行緒進行簡單的管理,並提供定時執行以及指向間隔迴圈執行等功能。

1.1 快取執行緒池CachedThreadPool

長度無限制,執行流程為:

  • 判斷執行緒池是否存在空閒執行緒
  • 存在即使用
  • 不存在,則建立執行緒,放入執行緒池,然後使用
    程式碼塊如下
public class Executor {
    public static void main(String[] args) throws InterruptedException {
        ExecutorService service = Executors.newCachedThreadPool();
        service.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "鋤禾日當午");
            }
        });
        service.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "鋤禾日當午");
            }
        });
        service.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "鋤禾日當午");
            }
        });
        Thread.sleep(1000);
        service.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"鋤禾日當午");
            }
        });
    }
}

執行結果如下,可以看到第四個任務使用的是第一個執行緒
在這裡插入圖片描述

1.2 定長執行緒池FixedThreadPool

長度是指定的數值,執行流程為:

  • 判斷執行緒池是否存在空閒執行緒
  • 存在即使用
  • 不存在空閒執行緒,且執行緒池未滿的情況下,則建立執行緒,放入執行緒池,然後使用
  • 不存在空閒執行緒,且執行緒池已滿的情況下,則等待執行緒池存在空閒執行緒
    程式碼塊如下
在這裡插入程式碼片

1.3 單執行緒執行緒池SingleThreadExecutor

效果與定長執行緒池建立時傳入數值1效果一致
程式碼塊如下

在這裡插入程式碼片

1.4 週期性任務定長執行緒池ScheduledThreadPool

它的核心執行緒數量時固定的,而非核心執行緒數是沒有限制的,並且當非核心執行緒閒置是會被立即回收。這類執行緒主要用於執行定時任務和具有固定週期的重複任務

相關文章