JAVA高并发线程
?
一、JAVA高級并發(fā)
1.5JDK之后引入高級并發(fā)特性,大多數(shù)的特性在java.util.concurrent?包中,是專門用于多線程發(fā)編程的,充分利用了現(xiàn)代多處理器和多核心系統(tǒng)的功能以編寫大規(guī)模并發(fā)應(yīng)用程序。主要包含原子量、并發(fā)集合、同步器、可重入鎖,并對線程池的構(gòu)造提供了強力的支持。
二、線性池
2.1線程池的5中創(chuàng)建方式
1、?Single Thread Executor?:?只有一個線程的線程池,因此所有提交的任務(wù)是順序執(zhí)行,
代碼:?Executors.newSingleThreadExecutor()
2、?Cached Thread Pool?:?線程池里有很多線程需要同時執(zhí)行,老的可用線程將被新的任務(wù)觸發(fā)重新執(zhí)行,如果線程超過60秒內(nèi)沒執(zhí)行,那么將被終止并從池中刪除,
代碼:Executors.newCachedThreadPool()
3、?Fixed Thread Pool?: 擁有固定線程數(shù)的線程池,如果沒有任務(wù)執(zhí)行,那么線程會一直等待,
代碼:?Executors.newFixedThreadPool(4)
在構(gòu)造函數(shù)中的參數(shù)4是線程池的大小,你可以隨意設(shè)置,也可以和cpu的核數(shù)量保持一致,獲取cpu的核數(shù)量int cpuNums = Runtime.getRuntime().availableProcessors();
4、?Scheduled Thread Pool :?用來調(diào)度即將執(zhí)行的任務(wù)的線程池,可能是不是直接執(zhí)行,?每隔多久執(zhí)行一次...?策略型的
代碼:Executors.newScheduledThreadPool()
5、?Single Thread Scheduled Pool :?只有一個線程,用來調(diào)度任務(wù)在指定時間執(zhí)行,代碼:Executors.newSingleThreadScheduledExecutor()
2.2 線程池的2種使用方式
1、提交?Runnable?,任務(wù)完成后?Future?對象返回?null調(diào)用excute,提交任務(wù),?匿名Runable重寫run方法, run方法里是業(yè)務(wù)邏輯
2、提交?Callable,該方法返回一個?Future?實例表示任務(wù)的狀態(tài)調(diào)用submit提交任務(wù),?匿名Callable,重寫call方法,?有返回值,?獲取返回值會阻塞,一直要等到線程任務(wù)返回結(jié)果
三、BlockingQueue制線程同步的工具(大數(shù)據(jù)的storm就是基于這種方式)
?
BlockingQueue也是java.util.concurrent下的主要用來控制線程同步的工具。
?
主要的方法是:put、take一對阻塞存取;add、poll一對非阻塞存取。
?
1、ArrayBlockingQueue:一個由數(shù)組支持的有界阻塞隊列,規(guī)定大小的BlockingQueue,其構(gòu)造函數(shù)必須帶一個int參數(shù)來指明其大小.其所含的對象是以FIFO(先入先出)順序排序的。
?
2、LinkedBlockingQueue:大小不定的BlockingQueue,若其構(gòu)造函數(shù)帶一個規(guī)定大小的參數(shù),生成的BlockingQueue有大小限制,若不帶大小參數(shù),所生成的BlockingQueue的大小由Integer.MAX_VALUE來決定.其所含的對象是以FIFO(先入先出)順序排序的。?
?
LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的話,默認(rèn)最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在隊列滿的時候會阻塞直到有隊列成員被消費,take方法在隊列空的時候會阻塞,直到有隊列成員被放進來。
?
LinkedBlockingQueue和ArrayBlockingQueue區(qū)別:
?
LinkedBlockingQueue和ArrayBlockingQueue比較起來,它們背后所用的數(shù)據(jù)結(jié)構(gòu)不一樣,導(dǎo)致LinkedBlockingQueue的數(shù)據(jù)吞吐量要大于ArrayBlockingQueue,但在線程數(shù)量很大時其性能的可預(yù)見性低于ArrayBlockingQueue.
三、不應(yīng)用線程池的缺點(在高并發(fā)的情況下表現(xiàn)比較顯著)
?
新建線程的開銷。線程雖然比進程要輕量許多,但對于JVM來說,新建一個線程的代價還是挺大的,決不同于新建一個對象
?
資源消耗量。沒有一個池來限制線程的數(shù)量,會導(dǎo)致線程的數(shù)量直接取決于應(yīng)用的并發(fā)量,這樣有潛在的線程數(shù)據(jù)巨大的可能,那么資源消耗量將是巨大的
?
穩(wěn)定性。當(dāng)線程數(shù)量超過系統(tǒng)資源所能承受的程度,穩(wěn)定性就會成問題
?
四、線程池的類型(4種)
?
不管是通過Executors創(chuàng)建線程池,還是通過Spring來管理,都得清楚知道有哪幾種線程池:
?
FixedThreadPool:定長線程池,提交任務(wù)時創(chuàng)建線程,直到池的最大容量,如果有線程非預(yù)期結(jié)束,會補充新線程
?
CachedThreadPool:可變線程池,它猶如一個彈簧,如果沒有任務(wù)需求時,它回收空閑線程,如果需求增加,則按需增加線程,不對池的大小做限制
?
SingleThreadExecutor:單線程。處理不過來的任務(wù)會進入FIFO隊列等待執(zhí)行
?
SecheduledThreadPool:周期性線程池。支持執(zhí)行周期性線程任務(wù)
五、線程無依賴性
?
多線程任務(wù)設(shè)計上盡量使得各任務(wù)是獨立無依賴的,所謂依賴性可兩個方面:
?
1、線程之間的依賴性。如果線程有依賴可能會造成死鎖或饑餓
?
2、調(diào)用者與線程的依賴性。調(diào)用者得監(jiān)視線程的完成情況,影響可并發(fā)量
轉(zhuǎn)載于:https://www.cnblogs.com/lykbk/p/dsdss3434343434343434.html
總結(jié)
- 上一篇: 银行理财风险等级划分
- 下一篇: awk 分解行、字段