1. 程式人生 > >論執行緒和執行緒池的區別及執行緒池的介紹

論執行緒和執行緒池的區別及執行緒池的介紹

1.new Thread的弊端

a. 每次new Thread新建物件效能差。
b. 執行緒缺乏統一管理,可能無限制新建執行緒,相互之間競爭,及可能佔用過多系統資源導致宕機或oom。
c. 缺乏更多功能,如定時執行、定期執行、執行緒中斷。

相比new Thread,Java提供的四種執行緒池的好處在於:

a. 重用存在的執行緒,減少物件建立、消亡的開銷,效能佳。
b. 可有效控制最大併發執行緒數,提高系統資源的使用率,同時避免過多資源競爭,避免堵塞。
c. 提供定時執行、定期執行、單執行緒、併發數控制等功能。

下面重點說下四種執行緒池:

java通過Executors提供四種執行緒池

newCachedThreadPool建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒執行緒,若無可回收,則新建執行緒。
newFixedThreadPool 建立一個定長執行緒池,可控制執行緒最大併發數,超出的執行緒會在佇列中等待。
newScheduledThreadPool 建立一個定長執行緒池,支援定時及週期性任務執行。
newSingleThreadExecutor 建立一個單執行緒化的執行緒池,它只會用唯一的工作執行緒來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先順序)執行。

以 newCachedThreadPool為例
建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒執行緒,若無可回收,則新建執行緒,可以寫一個執行緒池的工具類,以方便對所有的執行緒進行管理,程式碼如下

public class SysGlobal {

private finalstatic HashMap<Integer,ExecutorService> hsmpExecutorService = new HashMap<Integer,ExecutorService>();

public staticvoid execute(Runnable runnable, int priority) {

synchronized(hsmpExecutorService) {

ExecutorService executorService =hsmpExecutorService

.get(priority);

if(executorService ==null) {

executorService = Executors.newCachedThreadPool(new ThreadFactory() {

privateintpriority;

public ThreadFactory setPriority(int priority) {

this.priority = priority;

returnthis;

}

@Override

public Thread newThread(Runnable runnable) {

Thread thread =new Thread(runnable);

thread.setPriority(priority);

return thread;

}

}.setPriority(priority));

hsmpExecutorService.put(priority, executorService);

}

executorService.execute(runnable);

}

}

public staticvoid execute(Runnable runnable) {

execute(runnable,Thread.NORM_PRIORITY);

}

}