1. 程式人生 > >執行緒(八)執行緒池

執行緒(八)執行緒池

一、執行緒池

1、什麼是執行緒池?
答:
    經常建立、啟動銷燬一個執行緒都是非常消耗時間的。
    使用執行緒池進行管理和複用執行緒,提高程式效率。
 
面試答:
Java執行緒池能帶來的3個好處:
 1、降低資源消耗。通過重複利用已建立的執行緒降低執行緒建立和銷燬造成的消耗。
 2、提高響應速度。當任務到達時,任務可以不需要等到執行緒建立就能立即執行。
 3、提高執行緒的可管理性。執行緒是稀缺資源,如果無限制地建立,
 不僅會消耗系統資源。還會降低系統的穩定性。
 使用執行緒池可以統一分配、調優和監控,但是要合理利用。
 
Java使用執行緒核心走的是ThreadPoolExecutor。(建構函式)

二、使用執行緒池的方式

使用執行緒池的方式:
使用Executor 封裝好的四種執行緒池型別。
1、newCachodThreadPool建立一個可以快取執行緒池,如果執行緒池長度超過處理需要
,可靈活回收空閒執行緒,若無可回收,則新建執行緒。
2、newFixedThreadPool 建立一個定長的執行緒池。可控制執行緒最大併發數,超出的
執行緒會在佇列中等待。
3、newFixedThreadPool 建立一個定長的執行緒池。
4、newSingleThreadExecutor 建立一個單執行緒化的執行緒池,它只會用唯一的工作
執行緒來執行任務。

三、執行緒池合理配置

CPU密集、IO密集。

四、4種建立執行緒池的方式

1、newCachedThreadPool 建立可以快取的執行緒池

package com.leeue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
/**
 * @classDesc: 功能描述:(執行緒池四種建立方式 newCachedThreadPool 建立可快取的執行緒池)
 */
public class NewCachedThreadPoolDemo {
    public static void main(String[] args) {
        // 1、建立可快取的執行緒池 可以重複的利用
        ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
        for (int i = 0; i < 10; i++) {
            int temp = i;
            newCachedThreadPool.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println("ThreadName:" + Thread.currentThread().getName() + " i:" + temp);
                }
            });
        }
    }
}

顯示結果:本來程式是建立10個執行緒,這裡就建立了7個,說明有3個在複用

è¿éåå¾çæè¿°

2、newFixedThreadPool:建立固定長度的執行緒池

package com.leeue;
 
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
/**
 * 
 * @classDesc: 功能描述:(可固定長度的執行緒池  newFixedThreadPool)
 */
public class newFixedThreadPoolDemo {
    public static void main(String[] args) {
        //快捷鍵 ctrl+2 +F 來建立變數名
        ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(3);
        for(int i = 0; i < 10; i++) {
            int temp = i;
            newFixedThreadPool.execute(new Runnable() {
 
                @Override
                public void run() {
                System.out.println("ThreadName:"+Thread.currentThread().getName()+" i:"+temp);  
                }
            });
        }
 
    }
}

è¿éåå¾çæè¿°

3、newScheduledThreadPool:建立可以定時執行的執行緒池

package com.leeue;
 
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
 
/**
 * 
 * @classDesc: 功能描述:(建立 可定時的執行緒池)
 */
public class NewScheduledThreadPoolDemo {
    public static void main(String[] args) {
        ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(3);
        for(int i = 0; i < 10; i++) {
            int temp = i;
            newScheduledThreadPool.schedule(new Runnable() {
 
                @Override
                public void run() {
                    System.out.println("ThreadName:"+Thread.currentThread().getName()+" i:"+temp);  
 
                }
            }, 3, TimeUnit.SECONDS);//定時3秒後 執行這個執行緒池
        }
    }
}

è¿éåå¾çæè¿°

4、newSingleThreadExecutor:單執行緒池

package com.leeue;
 
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
/**
 * 
 * @classDesc: 功能描述:(單執行緒的執行緒池)
 */
public class NewSingleThreadScheduledDemo {
    public static void main(String[] args) {
        ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 10; i++) {
            int temp = i;
            newSingleThreadExecutor.execute(new Runnable() {
 
                @Override
                public void run() {
                    System.out.println("ThreadName:" + Thread.currentThread().getName() + " i:" + temp);
                }
            });
        }
    }
}

è¿éåå¾çæè¿°

5、停掉執行緒池的方法newSingleThreadExecutor.shutdown();//停掉執行緒池的方法

呼叫shoutdown()方法。

五、執行緒池原理分析

主要談:核心執行緒池、最大執行緒數

核心執行緒滿了,接下來進佇列,佇列也滿了,建立新執行緒,直到達到最大執行緒數,之後再超出,會進入拒絕rejectedExecution