1. 程式人生 > 實用技巧 >007.mysql-mysql索引精講

007.mysql-mysql索引精講

java執行緒池

什麼是執行緒池?
執行緒池就是一個容器,把建立的若干個執行緒放入這個容器中,當處理任務需要執行執行緒時,執行緒池會將執行緒提交到任務佇列中,處理完之後執行緒並不會被銷燬,而是仍然處於執行緒中,等待下一任務,如果之後還有任務要使用這個執行緒,該執行緒會再次被提交到任務佇列中。

使用執行緒池的優點

  1. java中建立執行緒,需要為執行緒分配一系列資源,假如建立執行緒的時間為t1,執行緒執行的任務時間為t2,執行緒銷燬的時間為t3,而往往t1+t3>t2,頻繁地建立和銷燬執行緒效率將會非常低
    2.執行緒池中的執行緒不會被銷燬,有任務需要時,直接可以提交到任務佇列
  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();
        }
}
    });
}

結果按照順序輸出

執行緒池中的引數

  1. corePoolSize:核心池大小
  2. maximumPoolSize:執行緒池最大執行緒數。
  3. keepAliveTime:表示執行緒沒有任務執行時最多保持多久時間會終止。預設情況下,只有執行緒數大於核心執行緒corePoolSize時,該引數才會起作用
  4. unit:引數keepAliveTime的時間單位
  5. workQueue:一個阻塞佇列,用來儲存等待執行的任務,有以下幾種選擇,ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue.
    6.threadFactory:執行緒工廠,主要用來建立執行緒
  6. handler:便是當拒絕處理任務時的策略,四種取值:
    ThreadPoolExecutor.AbortPolicy:丟棄任務並丟擲RejectedExecutionException異常。
    ThreadPoolExecutor.DiscardPolicy:也是丟棄任務,但是不丟擲異常。
    ThreadPoolExecutor.DiscardOldestPolicy:丟棄佇列最前面的任務,然後重新嘗試執行任務(重複此過程)
    ThreadPoolExecutor.CallerRunsPolicy:由點用執行緒處理該任務。

參考博文:https://www.jianshu.com/p/174958a72ce9
https://www.cnblogs.com/ConstXiong/p/11686245.html