論執行緒和執行緒池的區別及執行緒池的介紹
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
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);
}
}