久久艹影院,日韩一级一片中文字幕,国内视频一区二区,国产色播视频,日日狠狠久久,99精品999,中文字幕免费在线观看

java bus Java并發(fā)——阿里架構(gòu)師

一、創(chuàng)建線程

1.創(chuàng)建普通對象,只是在JVM的堆里分配一塊內(nèi)存而已

2.創(chuàng)建線程,需要調(diào)用操作系統(tǒng)內(nèi)核的API,然后操作系統(tǒng)需要為線程分配一系列資源,成本很高

線程是一個重量級對象,應(yīng)該避免頻繁創(chuàng)建和銷毀,采用線程池方案

二、一般的池化資源

// 假設(shè)Java線程池采用一般意義上池化資源的設(shè)計方法

class ThreadPool {

// 獲取空閑線程

Thread acquire() {

}

// 釋放線程

void release(Thread t) {

}

}

// 期望的使用

ThreadPool pool;

Thread T1 = pool.acquire();

// 傳入Runnable對象

T1.execute(() -> {

// 具體業(yè)務(wù)邏輯

});

三、生產(chǎn)者-消費者模式

業(yè)界線程池的設(shè)計,普遍采用生產(chǎn)者-消費者模式,線程池的使用方是生產(chǎn)者,線程池本身是消費者

public class MyThreadPool {

// 工作線程負責(zé)消費任務(wù)并執(zhí)行任務(wù)

class WorkerThread extends Thread {

@Override

public void run() {

// 循環(huán)取任務(wù)并執(zhí)行

while (true) {

Runnable task = null;

try {

task = workQueue.take();

} catch (InterruptedException e) {

}

task.run();

}

}

}

// 利用阻塞隊列實現(xiàn)生產(chǎn)者-消費者模式

private BlockingQueue workQueue;

// 內(nèi)部保存工作線程

List threads = new ArrayList<>();

public MyThreadPool(int poolSize, BlockingQueue workQueue) {

this.workQueue = workQueue;

for (int i = 0; i < poolSize; i++) {

WorkerThread work = new WorkerThread();

work.start();

threads.add(work);

}

}

// 提交任務(wù)

public void execute(Runnable command) throws InterruptedException {

workQueue.put(command);

}

public static void main(String[] args) throws InterruptedException {

// 創(chuàng)建有界阻塞隊列

BlockingQueue workQueue = new LinkedBlockingQueue<>(2);

// 創(chuàng)建線程池

MyThreadPool pool = new MyThreadPool(10, workQueue);

// 提交任務(wù)

pool.execute(() -> {

System.out.println("hello");

});

}

}

四、Java線程池

Ⅰ. ThreadPoolExecutor

int maximumPoolSize,

long keepAliveTime,

TimeUnit unit,

BlockingQueue workQueue,

ThreadFactory threadFactory,

RejectedExecutionHandler handler)

// 讓所有線程都支持超時,如果線程池很閑,那么將撤銷所有線程

public void allowCoreThreadTimeOut(boolean value)

復(fù)制代碼

1.corePoolSize:線程池保有的最小線程數(shù)

2.maximumPoolSize:線程池創(chuàng)建的最大線程數(shù)

3.keepAliveTime & unit

如果一個線程空閑了keepAliveTime & unit,并且線程池的線程數(shù)大于corePoolSize,那么這個空閑的線程就要被回收

4.workQueue:工作隊列

5.threadFactory:自定義如何創(chuàng)建線程

6.handler

線程池中的所有線程都很忙碌,并且工作隊列也滿了(工作隊列是有界隊列),此時提交任務(wù),線程池會拒絕接收

CallerRunsPolicy:提交任務(wù)的線程自己去執(zhí)行該任務(wù)

AbortPolicy:默認的拒絕策略,拋出RejectedExecutionException

DiscardPolicy:直接丟棄任務(wù),不會拋出任何異常

DiscardOldestPolicy:丟棄最老的任務(wù),然后把新任務(wù)加入到工作隊列中

Ⅱ. Executors

1.不建議使用Executors,因為Executors提供的很多默認方法使用的是無界隊列LinkedBlockingQueue

2.在高負載的情況下,無界隊列容易導(dǎo)致OOM,而OOM會導(dǎo)致所有請求都無法處理

3.因此強烈建議使用有界隊列

Ⅲ. 拒絕策略

1.使用有界隊列,當(dāng)任務(wù)過多時,線程池會觸發(fā)拒絕策略

2.線程池默認的拒絕策略會拋出RejectedExecutionException,這是一個運行時異常,開發(fā)時很容易忽略

3.如果線程池處理的任務(wù)非常重要,可以自定義拒絕策略

Ⅳ. 異常處理

1.使用ThreadPoolExecutor.execute()方法提交任務(wù)時,如果任務(wù)在執(zhí)行過程中出現(xiàn)運行時異常

會導(dǎo)致執(zhí)行任務(wù)的線程終止,并且無法獲得任何通知

2.因此最穩(wěn)妥的方法還是捕獲所有異常并處理

try {

// 業(yè)務(wù)邏輯

} catch (RuntimeException x) {

// 按需處理

} catch (Throwable x) {

// 按需處理

}

標(biāo)簽: java   阿里架構(gòu)師   開發(fā)  
來源:星島中文網(wǎng)
編輯:GY653

免責(zé)聲明:本網(wǎng)站內(nèi)容主要來自原創(chuàng)、合作媒體供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準(zhǔn)確性及可靠性,但不保證有關(guān)資料的準(zhǔn)確性及可靠性,讀者在使用前請進一步核實,并對任何自主決定的行為負責(zé)。本網(wǎng)站對有關(guān)資料所引致的錯誤、不確或遺漏,概不負任何法律責(zé)任。任何單位或個人認為本網(wǎng)站中的網(wǎng)頁或鏈接內(nèi)容可能涉嫌侵犯其知識產(chǎn)權(quán)或存在不實內(nèi)容時,應(yīng)及時向本網(wǎng)站提出書面權(quán)利通知或不實情況說明,并提供身份證明、權(quán)屬證明及詳細侵權(quán)或不實情況證明。本網(wǎng)站在收到上述法律文件后,將會依法盡快聯(lián)系相關(guān)文章源頭核實,溝通刪除相關(guān)內(nèi)容或斷開相關(guān)鏈接。

  • 相關(guān)推薦