執行緒池
概論
執行緒池是一種多執行緒處理形式,處理程序中將任務添加到佇列,然后在創建執行緒后自動啟動這些任務,
執行緒池的好處
-
降低資源的消耗
-
提高回應速度
-
方便管理
-
總結:執行緒復用,可以控制最大執行緒數,方便管理
//執行緒池
/**執行緒池 三大方法 七大引數 四種拒絕方式
* 執行緒池的好處
* 1.降低資源的消耗
* 2.提高回應的速度
* 3.方便管理
* 執行緒復用,可以控制最大執行緒數,方便管理
* */
public class Demo01 {
public static void main(String[] args) {
/**
* 執行緒池三大方法
* 能夠同時開啟的執行緒數
* 1.newSingleThreadExecutor() 創建一個單一執行緒
*2.newFixedThreadPool(5) 創建一個固定執行緒,能夠同時開啟5條執行緒
* 3.newCachedThreadPool() 遇強則強,主機的最大同時執行緒開啟數
*/
//ExecutorService service01= Executors.newSingleThreadExecutor();
//ExecutorService service02 = Executors.newFixedThreadPool(5);
ExecutorService service03 = Executors.newCachedThreadPool();
try {
for (int i = 1; i <=100 ; i++) {
//使用了執行緒池后,通過執行緒池來創建執行緒
service03.execute(()-> System.out.println(Thread.currentThread().getName()+"執行緒創建成功"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//使用執行緒池,在程式結束之前要關閉執行緒池
service03.shutdown();
}
}
}
三大方法
-
newSingleThreadExecutor() 創建一個單一執行緒 -
newFixedThreadPool(5) 創建一個固定執行緒,能夠同時開啟5條執行緒 -
newCachedThreadPool() 遇強則強,主機的最大同時執行緒開啟數
控制執行緒開啟的執行緒數
七大引數
public ThreadPoolExecutor(int corePoolSize,//核心執行緒池大小
int maximumPoolSize,//最大核心執行緒池大小
long keepAliveTime,//超時,沒有呼叫就會釋放
TimeUnit unit,//超時單位
BlockingQueue<Runnable> workQueue,//阻塞佇列
ThreadFactory threadFactory,//執行緒工廠,創建執行緒的,一般不用動
RejectedExecutionHandler handler//拒絕策略
6) {
if (corePoolSize < 0 ||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime < 0)
throw new IllegalArgumentException();
if (workQueue == null || threadFactory == null || handler == null)
throw new NullPointerException();
this.acc = System.getSecurityManager() == null ?
null :
AccessController.getContext();
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}
四大拒絕策略
-
new ThreadPoolExecutor.AbortPolicy() //銀行滿了,還有人進來,不處理這個人,直接拋出例外
-
new ThreadPoolExecutor.CallerRunsPolicy()//哪來的去哪里
-
new ThreadPoolExecutor.DiscardPolicy() //佇列滿了,丟到任務,不會拋出例外
-
new ThreadPoolExecutor.DiscardOldestPolicy()//佇列滿了嘗試和最早的執行緒競爭,成功進入,失敗丟掉,也不會拋出例外
/** 四大拒絕策略
*1.new ThreadPoolExecutor.AbortPolicy() //銀行滿了,還有人進來,不處理這個人,直接拋出例外
*2.new ThreadPoolExecutor.CallerRunsPolicy()//哪來的去哪里
*3.new ThreadPoolExecutor.DiscardPolicy() //佇列滿了,丟到任務,不會拋出例外
*4.new ThreadPoolExecutor.DiscardOldestPolicy()//佇列滿了嘗試和最早的執行緒競爭,成功進入,失敗丟掉,也不會拋出例外
*/
public class Demo02 {
public static void main(String[] args) {
ExecutorService threadPool = new ThreadPoolExecutor(
2,
5,
3,
TimeUnit.SECONDS,
new LinkedBlockingDeque<>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.DiscardOldestPolicy()
);
//最大承載數:Deque+Max
for (int i = 1; i <=3; i++) {
threadPool.execute(()-> {
System.out.println(Thread.currentThread().getName()+": "+"OK");
});
}
threadPool.shutdown();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/458608.html
標籤:Java
