Java爲我們提供了ExecutorService線程池來優化和管理線程的使用
使用線程池管理線程的優點
1、線程的創建和銷燬由線程池維護,一個線程在完成任務後並不會立即銷燬,而是由後續的任務複用這個線程,從而減少線程的創建和銷燬,節約系統的開銷
2、線程池旨在線程的複用,這就可以節約我們用以往的方式創建線程和銷燬所消耗的時間,減少線程頻繁調度的開銷,從而節約系統資源,提高系統吞吐量
3、在執行大量異步任務時提高了性能
4、Java內置的一套ExecutorService線程池相關的api,可以更方便的控制線程的最大併發數、線程的定時任務、單線程的順序執行等
使用ThreadPoolExecutor創建一個線程池管理類:
package com.pdoctor4u.activity;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* Created by chenxiangyu on 16/2/19.
*/
public class ThreadManager {
private static ThreadProxyPool threadProxyPool;
private static Object obj = new Object();
public static ThreadProxyPool getThreadProxyPool() {
synchronized (obj) {
if (threadProxyPool == null) {
threadProxyPool = new ThreadProxyPool(5,5,5L);
}
return threadProxyPool;
}
}
public static class ThreadProxyPool {
private ThreadPoolExecutor threadPoolExecutor;
private int corePoolSize;
private int maximumPoolSize;
private long keepAliveTime;
private ThreadProxyPool() {
}
private ThreadProxyPool(int corePoolSize, int maximumPoolSize,long keepAliveTime) {
this.corePoolSize = corePoolSize;
this.keepAliveTime = keepAliveTime;
this.maximumPoolSize = maximumPoolSize;
}
public void excute(Runnable runnable) {
if (runnable == null) {
return;
}
if (threadPoolExecutor == null || threadPoolExecutor.isShutdown()) {
threadPoolExecutor = new ThreadPoolExecutor(
//3 核心線程數
corePoolSize,
//5 最大線程數
maximumPoolSize,
//沒有執行任務的線程存活時間
keepAliveTime,
//存活時間的單位
TimeUnit.MICROSECONDS,
//線程中要準備去執行任務排隊的隊列
new LinkedBlockingDeque<Runnable>(),
//線程的工廠,創建線程
Executors.defaultThreadFactory(),
//隊列中如果放置不下任務時候的異常處理
new ThreadPoolExecutor.AbortPolicy());
}
threadPoolExecutor.execute(runnable);
}
//需要中止的是線程池中任務隊列裏面的任務
public void cancel(Runnable runnable) {
if (runnable != null) {
//獲取線程池對象,然後從其內部去移除相應的任務
threadPoolExecutor.getQueue().remove(runnable);
}
}
}
}
官方也不推薦使用這種方法來創建線程池,而是推薦使用Executors的工廠方法來創建線程池,Executors類是官方提供的一個工廠類,它裏面封裝好了衆多功能不一樣的線程池,從而使得我們創建線程池非常的簡便,主要提供瞭如下四種功能不一樣的線程池:
newCachedThreadPool創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閒線程,若無可回收,則新建線程。
newFixedThreadPool 創建一個定長線程池,可控制線程最大併發數,超出的線程會在隊列中等待。
newScheduledThreadPool 創建一個定長線程池,支持定時及週期性任務執行。
newSingleThreadExecutor 創建一個單線程化的線程池,它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行。