1. 程式人生 > >java 執行緒池基本用法

java 執行緒池基本用法

1,執行緒與程序的基本區別

->程序:
    擁有自己一整套變數,資料之間不可見。建立/撤銷-開銷很大。
->執行緒:
    共享資料,共享變數儲存在主存中(Main Memory),每個現場有自己私有的本地記憶體(Local Memory),本地記憶體存的是主存的一個副本,與程序相比,執行緒很"輕量",建立/撤銷-開銷比較小

2,實現一個執行緒的幾種方式

class MyThread extends Thread {
    @Override
    public void run() {
        //要執行的業務程式碼
    }

}


class MyRunner implements Runnable {
    @Override
    public void run() {
        //要執行的業務程式碼
    }   
}

//可以用執行緒池來執行
class MyCallable implements Callable<Object>{
    @Override
    public Object call() throws Exception{
        //要執行的業務程式碼
        return null;
    }   
}

3,Thread.start和Thread.run

Thread.start代表開啟一個執行緒,如果這個執行緒獲取到了CPU資源,處於執行態的話,就會執行業務程式碼,很顯然開啟執行緒,不一定會執行業務程式碼。

但是Thread.run,代表直接呼叫的run方法,作為普通的方法呼叫。

4,ThreadPoolExecutor七個引數的基本用法

ThreadPoolExecutor(
    int corePoolSize,
    int maxiNumPoolSize,
    long keepAliveTime,
    TimeUnit unit,
    BlockingQueue<Runnable> workQueue,
    THreadFactory tHreadFactory,
    RejectedExecutionHandler rejectedExecutionHandler
);

corePoolSize : 核心執行緒數,也就是執行緒池創建出來去執行使用者任務的執行緒個數,執行緒會呼叫任務的run方法(注意是呼叫run方法,而不是start開啟執行緒)。如果使用者提交的任務個數小於這個值,任務將會馬上被執行(有點絕對的說法,但是意思上也差不多)。
maxiNumPoolSize : 執行緒池能夠建立執行緒的最大值,什麼時候回動用這個值?就是當用戶提交的任務大於了corePoolSize,且超過了工作佇列workQueue可容納的最大值,就會在corePoolSize這個的基礎上再建立執行緒去處理任務(也就是任務量太多,執行緒池會加大處理的速度),但是總的執行緒數目不會超過maxiNumPoolSize。如果當前執行緒池建立的執行緒最大化了,workQueue滿了,就會拒絕使用者任務的加入。
workQueue :用來儲存使用者提交的任務佇列,用的是阻塞佇列(阻塞佇列有什麼特性,請看看JAVA的API以及原始碼)。
tHreadFactory : 執行緒池的執行緒工廠類,用來建立執行緒用的,一般就用執行緒池預設的好了。
rejectedExecutionHandler : 這個引數代表執行緒池拒絕使用者新增任務的處理策略。有四種處理方式:ThreadPoolExecutor.AbortPolicy(直接丟棄任務,丟擲異常,預設),ThreadPoolExecutor.DicardPolicy(直接丟棄任務,不丟擲異常),ThreadPoolExecutor.DicardOldestPolicy(丟棄最前面的任務,然後嘗試重新執行任務),ThreadPoolExecutor.CallerRunsPolicy(由呼叫現場處理任務,成功與否聽天由命)

5,執行緒池用法舉例

在使用執行緒池來併發執行任務時,需要考慮任務完成一次需要的時間,任務量多少,已經任務空閒時間需要多級,仔細評估以後,設定適合的引數,才能讓執行緒池更好的為業務程式碼服務。