歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java自制線程池

Java自制線程池

日期:2017/3/1 9:36:10   编辑:Linux編程

1.簡介

1.1.線程池

1.2.線程池作用

1.3.線程池優點

1.4.JDK自帶線程池

1.4.1.ThreadPoolExecutor

2.自制線程池

2.1.線程池主體類

2.2.任務類

2.3.測試類

簡介

線程池

線程池的基本思想是一種對象池的思想,先開辟一塊內存空間,開許多等待任務的線程,一旦有任務出現就直接使用線程池中的線程來進行任務,等到任務結束後再將這個線程放入線程池中,池中的執行調度由線程池管理器來管理。

線程池作用

線程池的作用就是更好的對系統中的線程進行管理,根據系統的環境清空,可以自動或者手動的設置線程數量,達到運行的最佳效果。

線程池優點

相對於不使用線程池來說,使用線程池有什麼優點呢?

減少了創建和銷毀線程的次數,每個工作線程都可以被重復利用,用完以後可以再用。

可以根據系統的能力,自由的控制線程池的大小,防止在沒有使用線程池的且對線程沒有進行很好的管理的條件下服務器消耗過多的內存而宕機

JDK自帶線程池

自從JDK1.5之後加入java.util.concurrent包後,線程池得到了極大的優化,現在只要按照提供的API來使用,我們就可以非常容易的使用JDK自帶的線程池,為我們在寫自己的程序時提供了極大的方便。

ThreadPoolExecutor

先來看看ThreadPoolExecutor的完整構造方法

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)

對於裡面的參數含義如下:

corePoolSize - 池中所保存的線程數,包括空閒線程。
maximumPoolSize - 池中允許的最大線程數。
keepAliveTime - 當線程數大於核心時,此為終止前多余的空閒線程等待新任務的最長時間。
unit - keepAliveTime 參數的時間單位。
workQueue - 執行前用於保持任務的隊列。此隊列僅保持由 execute 方法提交的 Runnable 任務。
threadFactory - 執行程序創建新線程時使用的工廠。
handler - 由於超出線程范圍和隊列容量而使執行被阻塞時所使用的處理程序。
下面介紹一些常用的線程池:

newSingleThreadExecutor:創建一個單線程的線程池。這個線程池只有一個線程在工作,也就是相當於單線程串行執行所有任務。如果這個唯一的線程因為異常結束,那麼會有一個新的線程來替代它。此線程池保證所有任務的執行順序按照任務的提交順序執行。

對應的構造方法

public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}

使用方法示例

//創建一個單線程的線程池
ExecutorService pool = Executors.newSingleThreadExecutor();
//創建實現了Runnable接口對象,Thread對象當然也實現了Runnable接口
Thread t1 = new MyThread();
//將線程放入池中進行執行
pool.execute(t1);
//關閉線程池
pool.shutdown();

newFixedThreadPool:創建固定大小的線程池。每次提交一個任務就創建一個線程,直到線程達到線程池的最大大小。線程池的大小一旦達到最大值就會保持不變,如果某個線程因為執行異常而結束,那麼線程池會補充一個新線程。

對應的構造方法

public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}

使用方法示例

//創建一個可重用固定線程數的線程池
ExecutorService pool = Executors.newFixedThreadPool(2);
//創建實現了Runnable接口對象,Thread對象當然也實現了Runnable接口
Thread t1 = new MyThread();
//將線程放入池中進行執行
pool.execute(t1);
//關閉線程池
pool.shutdown();

newCachedThreadPool:創建一個可緩存的無界線程池。如果線程池的大小超過了處理任務所需要的線程,那麼就會回收部分空閒(60秒不執行任務)的線程,當任務數增加時,此線程池又可以智能的添加新線程來處理任務。此線程池不會對線程池大小做限制,線程池大小完全依賴於操作系統(或者說JVM)能夠創建的最大線程大小。

對應的構造方法

public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}

使用方法示例

//創建一個可根據需要創建新線程的線程池,但是在以前構造的線程可用時將重用它們
ExecutorService pool = Executors.newCachedThreadPool();
//創建實現了Runnable接口對象,Thread對象當然也實現了Runnable接口
Thread t1 = new MyThread();
//將線程放入池中進行執行
pool.execute(t1);
//關閉線程池
pool.shutdown();

newScheduledThreadPool:創建一個大小無限的線程池。此線程池支持定時以及周期性執行任務的需求。

使用方法示例

////創建一個線程池,它可安排在給定延遲後運行命令或者定期地執行。
ExecutorService pool = Executors.newScheduledThreadPool(2);
//創建實現了Runnable接口對象,Thread對象當然也實現了Runnable接口
Thread t1 = new MyThread();
Thread t2 = new MyThread();
//將線程放入池中進行執行
pool.execute(t1);
//使用延遲執行風格的方法
pool.schedule(t2, 10, TimeUnit.MILLISECONDS);
//關閉線程池
pool.shutdown();

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-12/1106972.htm

Copyright © Linux教程網 All Rights Reserved