1. 程式人生 > >Java - "JUC線程池" 架構

Java - "JUC線程池" 架構

bst 靜態工廠 shutdown 使用 bsp -c int executor tex

Java多線程系列--“JUC線程池”01之 線程池架構

概要

前面分別介紹了"Java多線程基礎"、"JUC原子類"和"JUC鎖"。本章介紹JUC的最後一部分的內容——線程池。內容包括:
線程池架構圖
線程池示例

轉載請註明出處:http://www.cnblogs.com/skywang12345/p/3509903.html

線程池架構圖

線程池的架構圖如下:

技術分享

1. Executor

它是"執行者"接口,它是來執行任務的。準確的說,Executor提供了execute()接口來執行已提交的 Runnable 任務的對象。Executor存在的目的是提供一種將"任務提交"與"任務如何運行"分離開來的機制。
它只包含一個函數接口:

void execute(Runnable command)

2. ExecutorService

ExecutorService繼承於Executor。它是"執行者服務"接口,它是為"執行者接口Executor"服務而存在的;準確的話,ExecutorService提供了"將任務提交給執行者的接口(submit方法)","讓執行者執行任務(invokeAll, invokeAny方法)"的接口等等。

ExecutorService的函數列表

技術分享 View Code

3. AbstractExecutorService

AbstractExecutorService是一個抽象類,它實現了ExecutorService接口。
AbstractExecutorService存在的目的是為ExecutorService中的函數接口提供了默認實現。

AbstractExecutorService函數列表
由於它的函數列表和ExecutorService一樣,這裏就不再重復列舉了。

4. ThreadPoolExecutor

ThreadPoolExecutor就是大名鼎鼎的"線程池"。它繼承於AbstractExecutorService抽象類。

ThreadPoolExecutor函數列表

技術分享 View Code

5. ScheduledExecutorService

ScheduledExecutorService是一個接口,它繼承於於ExecutorService。它相當於提供了"延時"和"周期執行"功能的ExecutorService。
ScheduledExecutorService提供了相應的函數接口,可以安排任務在給定的延遲後執行,也可以讓任務周期的執行。

ScheduledExecutorService函數列表

技術分享 View Code

6. ScheduledThreadPoolExecutor

ScheduledThreadPoolExecutor繼承於ThreadPoolExecutor,並且實現了ScheduledExecutorService接口。它相當於提供了"延時"和"周期執行"功能的ScheduledExecutorService。
ScheduledThreadPoolExecutor類似於Timer,但是在高並發程序中,ScheduledThreadPoolExecutor的性能要優於Timer。

ScheduledThreadPoolExecutor函數列表

技術分享 View Code

7. Executors

Executors是個靜態工廠類。它通過靜態工廠方法返回ExecutorService、ScheduledExecutorService、ThreadFactory 和 Callable 等類的對象。

Executors函數列表

技術分享 View Code

線程池示例

下面通過示例來對線程池的使用做簡單演示。

技術分享
 1 import java.util.concurrent.Executors;
 2 import java.util.concurrent.ExecutorService;
 3 
 4 public class ThreadPoolDemo1 {
 5 
 6     public static void main(String[] args) {
 7         // 創建一個可重用固定線程數的線程池
 8         ExecutorService pool = Executors.newFixedThreadPool(2);
 9         // 創建實現了Runnable接口對象,Thread對象當然也實現了Runnable接口
10         Thread ta = new MyThread();
11         Thread tb = new MyThread();
12         Thread tc = new MyThread();
13         Thread td = new MyThread();
14         Thread te = new MyThread();
15         // 將線程放入池中進行執行
16         pool.execute(ta);
17         pool.execute(tb);
18         pool.execute(tc);
19         pool.execute(td);
20         pool.execute(te);
21         // 關閉線程池
22         pool.shutdown();
23     }
24 }
25 
26 class MyThread extends Thread {
27 
28     @Override
29     public void run() {
30         System.out.println(Thread.currentThread().getName()+ " is running.");
31     }
32 }
技術分享

運行結果

pool-1-thread-1 is running.
pool-1-thread-2 is running.
pool-1-thread-1 is running.
pool-1-thread-2 is running.
pool-1-thread-1 is running.

結果說明
主線程中創建了線程池pool,線程池的容量是2。即,線程池中最多能同時運行2個線程。
緊接著,將ta,tb,tc,td,te這3個線程添加到線程池中運行。
最後,通過shutdown()關閉線程池。

Java - "JUC線程池" 架構