007.mysql-mysql索引精講
阿新 • • 發佈:2020-09-04
java執行緒池
什麼是執行緒池?
執行緒池就是一個容器,把建立的若干個執行緒放入這個容器中,當處理任務需要執行執行緒時,執行緒池會將執行緒提交到任務佇列中,處理完之後執行緒並不會被銷燬,而是仍然處於執行緒中,等待下一任務,如果之後還有任務要使用這個執行緒,該執行緒會再次被提交到任務佇列中。
使用執行緒池的優點
- java中建立執行緒,需要為執行緒分配一系列資源,假如建立執行緒的時間為t1,執行緒執行的任務時間為t2,執行緒銷燬的時間為t3,而往往t1+t3>t2,頻繁地建立和銷燬執行緒效率將會非常低
2.執行緒池中的執行緒不會被銷燬,有任務需要時,直接可以提交到任務佇列 - 執行緒池可以統一分配執行緒,方便調優和監控,可以提高系統穩定性
執行緒池有哪些型別
1.newCachedThreadPool
一種可以快取的執行緒池,若是執行緒池長度超過了處理需要,將會靈活回收空閒執行緒,若是沒有課回收的執行緒,則會建立新的執行緒。該執行緒池容量為無限大,當執行第二個任務時,如果需要第一個已完成任務中執行過的執行緒,那麼執行緒池可以重複呼叫,不需要重新建立新的執行緒。
例項程式碼如下:
ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); for (int i = 0; i < 10; i++) { final int index = i; try { Thread.sleep(index * 1000); } catch (InterruptedException e) { e.printStackTrace(); } cachedThreadPool.execute(new Runnable() { @Override public void run() { System.out.println(index); } }); }
2 newFixedThreadPool
一種固定大小的執行緒池,可以控制執行緒最大併發數,超出的執行緒會在佇列中等待,定長執行緒池的大小可以根據系統資源進行設定。
示例程式碼:
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3); for (int i = 0; i < 10; i++) { final int index = i; fixedThreadPool.execute(new Runnable() { @Override public void run() { try { System.out.println(index); Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); }
因為執行緒池大小為3,每個任務輸出index後sleep 2秒,所以每兩秒列印3個數字
3 newScheduledThreadPool
一種定長的執行緒池,支援定時或者週期性地執行執行緒。
延遲3秒執行的示例程式碼:
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
scheduledThreadPool.schedule(new Runnable() {
@Override
public void run() {
System.out.println("delay 3 seconds");
}
}, 3, TimeUnit.SECONDS);
表示定長為5,延遲3秒執行的執行緒池
延遲1秒後每3秒執行一次,週期性執行的示例程式碼:
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("delay 1 seconds, and excute every 3 seconds");
}
}, 1, 3, TimeUnit.SECONDS);
4 newSingleThreadExecutor
一種單執行緒化的執行緒池,它會用唯一的工作執行緒來執行任務,保證所有任務按照指定順序執行。示例程式碼如下:
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
final int index = i;
singleThreadExecutor.execute(new Runnable() {
@Override
public void run() {
try {
System.out.println(index);
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
結果按照順序輸出
執行緒池中的引數
- corePoolSize:核心池大小
- maximumPoolSize:執行緒池最大執行緒數。
- keepAliveTime:表示執行緒沒有任務執行時最多保持多久時間會終止。預設情況下,只有執行緒數大於核心執行緒corePoolSize時,該引數才會起作用
- unit:引數keepAliveTime的時間單位
- workQueue:一個阻塞佇列,用來儲存等待執行的任務,有以下幾種選擇,ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue.
6.threadFactory:執行緒工廠,主要用來建立執行緒 - handler:便是當拒絕處理任務時的策略,四種取值:
ThreadPoolExecutor.AbortPolicy:丟棄任務並丟擲RejectedExecutionException異常。
ThreadPoolExecutor.DiscardPolicy:也是丟棄任務,但是不丟擲異常。
ThreadPoolExecutor.DiscardOldestPolicy:丟棄佇列最前面的任務,然後重新嘗試執行任務(重複此過程)
ThreadPoolExecutor.CallerRunsPolicy:由點用執行緒處理該任務。
參考博文:https://www.jianshu.com/p/174958a72ce9
https://www.cnblogs.com/ConstXiong/p/11686245.html