日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA高并发线程

發(fā)布時間:2024/10/12 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA高并发线程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

一、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é)

以上是生活随笔為你收集整理的JAVA高并发线程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。