奶头挺立呻吟高潮av全片,成人试看120秒体验区,性欧美极品v,A片高潮抽搐揉捏奶头视频

java語(yǔ)言

Java多線程的開(kāi)發(fā)技巧

時(shí)間:2025-04-21 17:09:12 java語(yǔ)言 我要投稿
  • 相關(guān)推薦

Java多線程的開(kāi)發(fā)技巧

  導(dǎo)語(yǔ):很多開(kāi)發(fā)者談到Java多線程開(kāi)發(fā),僅僅停留在new Thread(…).start()或直接使用Executor框架這個(gè)層面,對(duì)于線程的管理和控制卻不夠深入,下面是 Java多線程的開(kāi)發(fā)技巧,一起來(lái)學(xué)習(xí)下吧:

  不使用線程池的缺點(diǎn)

  有些開(kāi)發(fā)者圖省事,遇到需要多線程處理的地方,直接new Thread(…).start(),對(duì)于一般場(chǎng)景是沒(méi)問(wèn)題的,但如果是在并發(fā)請(qǐng)求很高的情況下,就會(huì)有些隱患:

  1. 新建線程的開(kāi)銷(xiāo)。線程雖然比進(jìn)程要輕量許多,但對(duì)于JVM來(lái)說(shuō),新建一個(gè)線程的代價(jià)還是挺大的,決不同于新建一個(gè)對(duì)象。

  2. 資源消耗量。沒(méi)有一個(gè)池來(lái)限制線程的數(shù)量,會(huì)導(dǎo)致線程的數(shù)量直接取決于應(yīng)用的并發(fā)量,這樣有潛在的線程數(shù)據(jù)巨大的可能,那么資源消耗量將是巨大的。

  3. 穩(wěn)定性。當(dāng)線程數(shù)量超過(guò)系統(tǒng)資源所能承受的程度,穩(wěn)定性就會(huì)成問(wèn)題。

  制定執(zhí)行策略

  在每個(gè)需要多線程處理的地方,不管并發(fā)量有多大,需要考慮線程的執(zhí)行策略:

  1. 任務(wù)以什么順序執(zhí)行

  2. 可以有多少個(gè)任務(wù)并發(fā)執(zhí)行

  3. 可以有多少個(gè)任務(wù)進(jìn)入等待執(zhí)行隊(duì)列

  4. 系統(tǒng)過(guò)載的時(shí)候,應(yīng)該放棄哪些任務(wù)?如何通知到應(yīng)用程序?

  5. 一個(gè)任務(wù)的執(zhí)行前后應(yīng)該做什么處理

  線程池的類(lèi)型

  不管是通過(guò)Executors創(chuàng)建線程池,還是通過(guò)Spring來(lái)管理,都得清楚知道有哪幾種線程池:

  FixedThreadPool:定長(zhǎng)線程池,提交任務(wù)時(shí)創(chuàng)建線程,直到池的最大容量,如果有線程非預(yù)期結(jié)束,會(huì)補(bǔ)充新線程

  CachedThreadPool:可變線程池,它猶如一個(gè)彈簧,如果沒(méi)有任務(wù)需求時(shí),它回收空閑線程,如果需求增加,則按需增加線程,不對(duì)池的大小做限制

  SingleThreadExecutor:?jiǎn)尉程。處理不過(guò)來(lái)的任務(wù)會(huì)進(jìn)入FIFO隊(duì)列等待執(zhí)行

  SecheduledThreadPool:周期性線程池。支持執(zhí)行周期性線程任務(wù)

  其實(shí),這些不同類(lèi)型的線程池都是通過(guò)構(gòu)建一個(gè)ThreadPoolExecutor來(lái)完成的,所不同的是corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,threadFactory這么幾個(gè)參數(shù)。具體可以參見(jiàn)JDK DOC。

  線程池飽和策略

  由以上線程池類(lèi)型可知,除了CachedThreadPool其他線程池都有飽和的可能,當(dāng)飽和以后就需要相應(yīng)的策略處理請(qǐng)求線程的任務(wù),ThreadPoolExecutor采取的方式通過(guò)隊(duì)列來(lái)存儲(chǔ)這些任務(wù),當(dāng)然會(huì)根據(jù)池類(lèi)型不同選擇不同的隊(duì)列,比如FixedThreadPool和SingleThreadExecutor默認(rèn)采用的是無(wú)限長(zhǎng)度的LinkedBlockingQueue。但從系統(tǒng)可控性講,最好的做法是使用定長(zhǎng)的ArrayBlockingQueue或有限的LinkedBlockingQueue,并且當(dāng)達(dá)到上限時(shí)通過(guò)ThreadPoolExecutor.setRejectedExecutionHandler方法設(shè)置一個(gè)拒絕任務(wù)的策略,JDK提供了AbortPolicy、CallerRunsPolicy、DiscardPolicy、DiscardOldestPolicy幾種策略,具體差異可見(jiàn)JDK DOC

  線程無(wú)依賴性

  多線程任務(wù)設(shè)計(jì)上盡量使得各任務(wù)是獨(dú)立無(wú)依賴的,所謂依賴性可兩個(gè)方面:

  線程之間的依賴性。如果線程有依賴可能會(huì)造成死鎖或饑餓

  調(diào)用者與線程的依賴性。調(diào)用者得監(jiān)視線程的完成情況,影響可并發(fā)量

  當(dāng)然,在有些業(yè)務(wù)里確實(shí)需要一定的依賴性,比如調(diào)用者需要得到線程完成后結(jié)果,傳統(tǒng)的Thread是不便完成的,因?yàn)閞un方法無(wú)返回值,只能通過(guò)一些共享的變量來(lái)傳遞結(jié)果,但在Executor框架里可以通過(guò)Future和Callable實(shí)現(xiàn)需要有返回值的任務(wù),當(dāng)然線程的異步性導(dǎo)致需要有相應(yīng)機(jī)制來(lái)保證調(diào)用者能等待任務(wù)完成,關(guān)于Future和Callable的用法見(jiàn)下面的實(shí)例就一目了然了:

  01 public class FutureRenderer {

  02 private final ExecutorService executor = ...;

  03 void renderPage(CharSequence source) {

  04 final ListimageInfos = scanForImageInfo(source);

  05 Callable<list> task =

  06 new Callable<list>() {

  07 public Listcall() {

  08 Listresult

  09 = new ArrayList();

  10 for (ImageInfo imageInfo : imageInfos)

  11 result.add(imageInfo.downloadImage());

  12 return result;

  13 }

  14 };

  15 Future<list> future = executor.submit(task);

  16 renderText(source);

  17 try {

  18 ListimageData = future.get();

  19 for (ImageData data : imageData)

  20 renderImage(data);

  21 } catch (InterruptedException e) {

  22 // Re-assert the thread's interrupted status

  23 Thread.currentThread().interrupt();

  24 // We don't need the result, so cancel the task too

  25 future.cancel(true);

  26 } catch (ExecutionException e) {

  27 throw launderThrowable(e.getCause());

  28 }

  29 }

  30 }

  以上代碼關(guān)鍵在于List imageData = future.get();如果Callable類(lèi)型的任務(wù)沒(méi)有執(zhí)行完時(shí),調(diào)用者會(huì)阻塞等待。不過(guò)這樣的方式還是得謹(jǐn)慎使用,很容易造成不良設(shè)計(jì)。另外對(duì)于這種需要等待的場(chǎng)景,就需要設(shè)置一個(gè)最大容忍時(shí)間timeout,設(shè)置方法可以在 future.get()加上timeout參數(shù),或是再調(diào)用ExecutorService.invokeAll 加上timeout參數(shù)

  線程的取消與關(guān)閉

  一般的情況下是讓線程運(yùn)行完成后自行關(guān)閉,但有些時(shí)候也會(huì)中途取消或關(guān)閉線程,比如以下情況:

  調(diào)用者強(qiáng)制取消。比如一個(gè)長(zhǎng)時(shí)間運(yùn)行的任務(wù),用戶點(diǎn)擊”cancel”按鈕強(qiáng)行取消

  限時(shí)任務(wù)

  發(fā)生不可處理的任務(wù)

  整個(gè)應(yīng)用程序或服務(wù)的關(guān)閉

  因此需要有相應(yīng)的取消或關(guān)閉的方法和策略來(lái)控制線程,一般有以下方法:

  1)通過(guò)變量標(biāo)識(shí)來(lái)控制

  這種方式比較老土,但使用得非常廣泛,主要缺點(diǎn)是對(duì)有阻塞的操作控制不好,代碼示例如下所示:

  01 public class PrimeGenerator implements Runnable {

  02 @GuardedBy("this")

  03 private final Listprimes

  04 = new ArrayList();

  05 private volatile boolean cancelled;

  06 public void run() {

  07 BigInteger p = BigInteger.ONE;

  08 while (!cancelled ) {

  09 p = p.nextProbablePrime();

  10 synchronized (this) {

  11 primes.add(p);

  12 }

  13 }

  14 }

  15 public void cancel() { cancelled = true; }

  16 public synchronized Listget() {

  17 return new ArrayList(primes);

  18 }

  19 }

  2)中斷

  中斷通常是實(shí)現(xiàn)取消最明智的選擇,但線程自身需要支持中斷處理,并且要處理好中斷策略,一般響應(yīng)中斷的方式有兩種:

  處理完中斷清理后繼續(xù)傳遞中斷異常(InterruptedException)

  調(diào)用interrupt方法,使得上層能感知到中斷異常

  3) 取消不可中斷阻塞

  存在一些不可中斷的阻塞,比如:

  java.io和java.nio中同步讀寫(xiě)IO

  Selector的異步IO

  獲取鎖

  對(duì)于這些線程的取消,則需要特定情況特定對(duì)待,比如對(duì)于socket阻塞,如果要安全取消,則需要調(diào)用socket.close()

  4)JVM的關(guān)閉

  如果有任務(wù)需要在JVM關(guān)閉之前做一些清理工作,而不是被JVM強(qiáng)硬關(guān)閉掉,可以使用JVM的鉤子技術(shù),其實(shí)JVM鉤子也只是個(gè)很普通的技術(shù),也就是用個(gè)map把一些需要JVM關(guān)閉前啟動(dòng)的任務(wù)保存下來(lái),在JVM關(guān)閉過(guò)程中的某個(gè)環(huán)節(jié)來(lái)并發(fā)啟動(dòng)這些任務(wù)線程。具體使用示例如下:

  1 public void start() {

  2 Runtime.getRuntime().addShutdownHook(new Thread() {

  3 public void run() {

  4 try { LogService.this.stop(); }

  5 catch (InterruptedException ignored) {}

  6 }

  7 });

  8 }


【Java多線程的開(kāi)發(fā)技巧】相關(guān)文章:

java的多線程09-09

java多線程08-31

Java語(yǔ)言程序調(diào)試技巧與多線程問(wèn)題06-14

java語(yǔ)言的多線程08-29

java多線程介紹08-23

java多線程教程11-03

如何使用java多線程08-23

Java多線程問(wèn)題總結(jié)10-24

Java使用多線程的優(yōu)勢(shì)07-10

主站蜘蛛池模板: 寿阳县| 密山市| 苏尼特右旗| 鹿泉市| 什邡市| 廊坊市| 莱西市| 炎陵县| 大同县| 苏尼特左旗| 隆子县| 融水| 澄迈县| 大城县| 娱乐| 五寨县| 长海县| 承德市| 肇东市| 马鞍山市| 永丰县| 孟津县| 商丘市| 社旗县| 穆棱市| 五原县| 阜城县| 华亭县| 陕西省| 什邡市| 友谊县| 浑源县| 昌江| 大竹县| 博罗县| 婺源县| 丰原市| 弥勒县| 许昌县| 鸡东县| 通渭县|