摘要:的多任務(wù)執(zhí)行框架提供了一套線程框架來幫助開發(fā)者有效的進(jìn)行線程控制,扮演線程工廠的角色,其創(chuàng)建線程的方法如下返回固定數(shù)量的線程池,該方法的線程數(shù)始終不變。
1.Jdk的多任務(wù)執(zhí)行框架
JDK提供了一套線程框架Executor來幫助開發(fā)者有效的進(jìn)行線程控制,Executors扮演線程工廠的角色,其創(chuàng)建線程的方法如下
newFixedThreadPool() 返回固定數(shù)量的線程池,該方法的線程數(shù)始終不變。若線程空閑則立即執(zhí)行 否則暫緩到隊(duì)列中
newSingleThreadPool() 創(chuàng)建一個(gè)線程池,若線程空閑則立即執(zhí)行 否則暫緩到隊(duì)列中
newCachedThreadPool() 返回一個(gè)可根據(jù)實(shí)際情況調(diào)整線程個(gè)數(shù)的線程池 ,若線程空閑則立即執(zhí)行 否則暫緩到隊(duì)列中
newScheduledThreadPool() 返回一個(gè)ScheduledExecutorService對(duì)象,但該線程可以執(zhí)行線程的數(shù)量(schedule 排定/安排/目錄)
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(10); //command 就是一個(gè)Thread ScheduledFuture> scheduledTask = scheduler.scheduleWithFixedDelay(command,5,1, TimeUnit.SECONDS);
若Executors工廠類無法滿足我們的需求,可以自己去創(chuàng)建自定義的線程池。自定義線程池的構(gòu)造方法如下
public ThreadPoolExecutor(int corePoolSize,//核心線程數(shù) int maximumPoolSize,//最大線程數(shù) long keepAliveTime,//線程的空閑時(shí)間 TimeUnit unit,//給定單元粒度的時(shí)間段 BlockingQueueworkQueue,//有界、無界隊(duì)列 RejectedExecutoionHandler handler//任務(wù)拒絕策略 ){.....}
使用什么隊(duì)列對(duì)該構(gòu)造方法來說比較關(guān)鍵
使用有界隊(duì)列 如有任務(wù)需要執(zhí)行 如果實(shí)際線程數(shù) 使用無界隊(duì)列LinkedBlockingQueue 除非系統(tǒng)資源耗盡 否則不會(huì)出現(xiàn)入隊(duì)失敗 JDK的拒絕策略 AbortPolicy:直接拋出異常 系統(tǒng)正常工作 CallerRunsPolicy:只要線程池未被關(guān)閉 嘗試運(yùn)行被丟棄的任務(wù) DiscardOldestPolicy:丟失最老的請(qǐng)求 嘗試提交當(dāng)前任務(wù) DiscardPolicy:丟棄無法處理的任務(wù)不給予處理 JDK提供的拒絕策略不友好,可以自定義拒絕策略,實(shí)現(xiàn)RejectedExecutionHandler接口(添加日志等等) 2.Concurrent.util工具類詳解 CyclicBarrier CountDownLatch Callable 和Future使用 Semaphore信號(hào)量 3.鎖的高級(jí)深化 Lock and Condition 使用Lock對(duì)象也可以實(shí)現(xiàn)同步互斥 如果多個(gè)線程之間需要實(shí)現(xiàn)協(xié)作 使用Object的wait和nofity,notifyAll 在使用Lock的時(shí)候可以使用一個(gè)新的等待/通知的類Condition 只針對(duì)一個(gè)具體的鎖 ReentrantLock重入鎖 ReentrantReadWriteLock讀寫鎖 鎖的優(yōu)化 避免死鎖 減少鎖的持有時(shí)間 減少鎖的粒度 鎖的分離 盡量使用無鎖的操作 比如原子類操作 如果實(shí)際線程數(shù)>corePoolSize,則將任務(wù)添加到緩存隊(duì)列
如果緩存隊(duì)列已滿 ,總線程
如有任務(wù)需要執(zhí)行 如果實(shí)際線程數(shù)
BlockingQueue
public class MyRejected implements RejectedExecutionHandler {
public MyRejected(){}
@Override
public void rejectedExecution(Runnable r,
ThreadPoolExecutor executor) {
System.out.println("自定義處理");
System.out.println("當(dāng)前被拒絕的任務(wù)為"+r.toString());
}
}
假設(shè)每一個(gè)線程代表一個(gè)運(yùn)動(dòng)員,當(dāng)運(yùn)動(dòng)員都準(zhǔn)備好了,才能一起出發(fā)。CyclicBarrier barrier = new CyclicBarrier(3);
經(jīng)常用于監(jiān)聽某些初始化操作,當(dāng)初始化執(zhí)行完畢以后,通知主線程繼續(xù)工作final CountDownLatch countDownLatch = new CountDownLatch(2);
Futrue模式費(fèi)用適合在處理耗時(shí)很長的業(yè)務(wù)邏輯進(jìn)行使用,可以有效的減小系統(tǒng)的影響,
提高系統(tǒng)的吞吐量 public class UseFuture implements Callable
可以控制系統(tǒng)的流量,拿到線程的信號(hào)量則訪問否則等待
通過acquire和release來獲取和釋放線程 final Semaphore semp = new Semaphore(5);
使用synchronized關(guān)鍵字可以實(shí)現(xiàn)線程間的同步互斥工作 public class UseCondition {
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
public void method1(){
try {
lock.lock();
System.out.println("當(dāng)前線程:" +
Thread.currentThread().getName() + "進(jìn)入等待狀態(tài)..");
Thread.sleep(3000);
System.out.println("當(dāng)前線程:" +
Thread.currentThread().getName() + "釋放鎖..");
condition.await(); // Object wait
System.out.println("當(dāng)前線程:" +
Thread.currentThread().getName() +"繼續(xù)執(zhí)行...");
condition.signal(); //Object notify
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
private Lock lock = new ReentrantLock(boolean isFair);//是否為公平鎖
核心是實(shí)現(xiàn)讀寫分離 在都多寫少的情況下 性能高于重入鎖public class UseReentrantReadWriteLock {
private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
private ReadLock readLock = rwLock.readLock();
private WriteLock writeLock = rwLock.writeLock();
public void read(){
try {
readLock.lock();
System.out.println("當(dāng)前線程:" +
Thread.currentThread().getName() + "進(jìn)入...");
Thread.sleep(3000);
System.out.println("當(dāng)前線程:" +
Thread.currentThread().getName() + "退出...");
} catch (Exception e) {
e.printStackTrace();
} finally {
readLock.unlock();
}
}
public void write(){
try {
writeLock.lock();
System.out.println("當(dāng)前線程:" +
Thread.currentThread().getName() + "進(jìn)入...");
Thread.sleep(3000);
System.out.println("當(dāng)前線程:" +
Thread.currentThread().getName() + "退出...");
} catch (Exception e) {
e.printStackTrace();
} finally {
writeLock.unlock();
}
}
}
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/70552.html
摘要:今天給大家總結(jié)一下,面試中出鏡率很高的幾個(gè)多線程面試題,希望對(duì)大家學(xué)習(xí)和面試都能有所幫助。指令重排在單線程環(huán)境下不會(huì)出先問題,但是在多線程環(huán)境下會(huì)導(dǎo)致一個(gè)線程獲得還沒有初始化的實(shí)例。使用可以禁止的指令重排,保證在多線程環(huán)境下也能正常運(yùn)行。 下面最近發(fā)的一些并發(fā)編程的文章匯總,通過閱讀這些文章大家再看大廠面試中的并發(fā)編程問題就沒有那么頭疼了。今天給大家總結(jié)一下,面試中出鏡率很高的幾個(gè)多線...
摘要:后端好書閱讀與推薦這一兩年來養(yǎng)成了買書看書的習(xí)慣,陸陸續(xù)續(xù)也買了幾十本書了,但是一直沒有養(yǎng)成一個(gè)天天看書的習(xí)慣。高級(jí)程序設(shè)計(jì)高級(jí)程序設(shè)計(jì)第版豆瓣有人可能會(huì)有疑問,后端為啥要學(xué)呢其實(shí)就是為了更好的使用做鋪墊。 后端好書閱讀與推薦 這一兩年來養(yǎng)成了買書看書的習(xí)慣,陸陸續(xù)續(xù)也買了幾十本書了,但是一直沒有養(yǎng)成一個(gè)天天看書的習(xí)慣。今天突然想要做個(gè)決定:每天至少花1-3小時(shí)用來看書。這里我準(zhǔn)備把這...
摘要:后端好書閱讀與推薦這一兩年來養(yǎng)成了買書看書的習(xí)慣,陸陸續(xù)續(xù)也買了幾十本書了,但是一直沒有養(yǎng)成一個(gè)天天看書的習(xí)慣。高級(jí)程序設(shè)計(jì)高級(jí)程序設(shè)計(jì)第版豆瓣有人可能會(huì)有疑問,后端為啥要學(xué)呢其實(shí)就是為了更好的使用做鋪墊。 后端好書閱讀與推薦 這一兩年來養(yǎng)成了買書看書的習(xí)慣,陸陸續(xù)續(xù)也買了幾十本書了,但是一直沒有養(yǎng)成一個(gè)天天看書的習(xí)慣。今天突然想要做個(gè)決定:每天至少花1-3小時(shí)用來看書。這里我準(zhǔn)備把這...
摘要:對(duì)象改變條件對(duì)象當(dāng)前線程要等待線程終止之后才能從返回。如果線程在上的操作中被中斷,通道會(huì)被關(guān)閉,線程的中斷狀態(tài)會(huì)被設(shè)置,并得到一個(gè)。清除線程的中斷狀態(tài)。非公平性鎖雖然可能造成饑餓,但極少的線程切換,保證其更大的吞吐量。 聲明:Java并發(fā)的內(nèi)容是自己閱讀《Java并發(fā)編程實(shí)戰(zhàn)》和《Java并發(fā)編程的藝術(shù)》整理來的。 showImg(https://segmentfault.com/im...
摘要:如問到是否使用某框架,實(shí)際是是問該框架的使用場(chǎng)景,有什么特點(diǎn),和同類可框架對(duì)比一系列的問題。這兩個(gè)方向的區(qū)分點(diǎn)在于工作方向的側(cè)重點(diǎn)不同。 [TOC] 這是一份來自嗶哩嗶哩的Java面試Java面試 32個(gè)核心必考點(diǎn)完全解析(完) 課程預(yù)習(xí) 1.1 課程內(nèi)容分為三個(gè)模塊 基礎(chǔ)模塊: 技術(shù)崗位與面試 計(jì)算機(jī)基礎(chǔ) JVM原理 多線程 設(shè)計(jì)模式 數(shù)據(jù)結(jié)構(gòu)與算法 應(yīng)用模塊: 常用工具集 ...
閱讀 1055·2021-11-24 10:30
閱讀 2382·2021-10-08 10:04
閱讀 4045·2021-09-30 09:47
閱讀 1535·2021-09-29 09:45
閱讀 1515·2021-09-24 10:33
閱讀 6359·2021-09-22 15:57
閱讀 2402·2021-09-22 15:50
閱讀 4135·2021-08-30 09:45