真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java中線程池的使用場景有哪些

今天就跟大家聊聊有關(guān)Java中線程池的使用場景有哪些,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)公司是創(chuàng)新、創(chuàng)意、研發(fā)型一體的綜合型網(wǎng)站建設(shè)公司,自成立以來公司不斷探索創(chuàng)新,始終堅持為客戶提供滿意周到的服務(wù),在本地打下了良好的口碑,在過去的十載時間我們累計服務(wù)了上千家以及全國政企客戶,如成都花箱等企業(yè)單位,完善的項目管理流程,嚴(yán)格把控項目進度與質(zhì)量監(jiān)控加上過硬的技術(shù)實力獲得客戶的一致夸獎。

 一、如下方式存在的問題

new Thread() {     @Override     public void run() {         // 業(yè)務(wù)邏輯     } }.start();

1、首先頻繁的創(chuàng)建、銷毀對象是一個很消耗性能的事情;2、如果用戶量比較大,導(dǎo)致占用過多的資源,可能會導(dǎo)致我們的服務(wù)由于資源不足而宕機;3、綜上所述,在實際的開發(fā)中,這種操作其實是不可取的一種方式。

二、使用線程池有什么優(yōu)點

1、線程池中線程的使用率提升,減少對象的創(chuàng)建、銷毀;2、線程池可以控制線程數(shù),有效的提升

執(zhí)行結(jié)果

Java中線程池的使用場景有哪些

通過分析我看可以看到,至始至終都由一個線程執(zhí)行,實現(xiàn)了線程的復(fù)用,并沒有創(chuàng)建多余的線程。如果當(dāng)我們的業(yè)務(wù)需要一定的時間進行處理,那么將會出現(xiàn)什么結(jié)果。我們來模擬一下。

Java中線程池的使用場景有哪些

可以明顯的看出,現(xiàn)在就需要幾條線程來交替執(zhí)行。

不足:這種方式雖然可以根據(jù)業(yè)務(wù)場景自動的擴展線程數(shù)來處理我們的業(yè)務(wù),但是最多需要多少個線程同時處理缺是我們無法控制的;

優(yōu)點:如果當(dāng)?shù)诙€任務(wù)開始,第一個任務(wù)已經(jīng)執(zhí)行結(jié)束,那么第二個任務(wù)會復(fù)用第一個任務(wù)創(chuàng)建的線程,并不會重新創(chuàng)建新的線程,提高了線程的復(fù)用率;

2、newFixedThreadPool

這種方式可以指定線程池中的線程數(shù)。舉個栗子,如果一間澡堂子最大只能容納20個人同時洗澡,那么后面來的人只能在外面排隊等待。如果硬往里沖,那么只會出現(xiàn)一種情景,摩擦摩擦...

首先測試一下最大容量為一個線程,那么會不會是我們預(yù)測的結(jié)果。

public static void method_01() throws InterruptedException {      ExecutorService executor = Executors.newFixedThreadPool(1);      for (int i = 0; i < 10; i++) {          Thread.sleep(1000);         final int index = i;          executor.execute(() -> {             try {                 Thread.sleep(2 * 1000);             } catch (InterruptedException e) {                 e.printStackTrace();             }             System.out.println(Thread.currentThread().getName() + "  " + index);         });     }     executor.shutdown(); }

執(zhí)行結(jié)果

Java中線程池的使用場景有哪些

我們改為3條線程再來看下結(jié)果

Java中線程池的使用場景有哪些

優(yōu)點:兩個結(jié)果綜合說明,newFixedThreadPool的線程數(shù)是可以進行控制的,因此我們可以通過控制最大線程來使我們的服務(wù)器打到最大的使用率,同事又可以保證及時流量突然增大也不會占用服務(wù)器過多的資源。

3、newScheduledThreadPool

該線程池支持定時,以及周期性的任務(wù)執(zhí)行,我們可以延遲任務(wù)的執(zhí)行時間,也可以設(shè)置一個周期性的時間讓任務(wù)重復(fù)執(zhí)行。 該線程池中有以下兩種延遲的方法。

測試一

public static void method_02() {     ScheduledExecutorService executor = Executors.newScheduledThreadPool(5);      executor.scheduleAtFixedRate(new Runnable() {         @Override         public void run() {             long start = new Date().getTime();             System.out.println("scheduleAtFixedRate 開始執(zhí)行時間:" +                     DateFormat.getTimeInstance().format(new Date()));             try {                 Thread.sleep(5000);             } catch (InterruptedException e) {                 e.printStackTrace();             }             long end = new Date().getTime();             System.out.println("scheduleAtFixedRate 執(zhí)行花費時間=" + (end - start) / 1000 + "m");             System.out.println("scheduleAtFixedRate 執(zhí)行完成時間:" + DateFormat.getTimeInstance().format(new Date()));             System.out.println("======================================");         }     }, 1, 5, TimeUnit.SECONDS); }

執(zhí)行結(jié)果

Java中線程池的使用場景有哪些

測試二

Java中線程池的使用場景有哪些

總結(jié):以上兩種方式不同的地方是任務(wù)的執(zhí)行時間,如果間隔時間大于任務(wù)的執(zhí)行時間,任務(wù)不受執(zhí)行時間的影響。如果間隔時間小于任務(wù)的執(zhí)行時間,那么任務(wù)執(zhí)行結(jié)束之后,會立馬執(zhí)行,至此間隔時間就會被打亂。

測試一

public static void method_03() {     ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);      executor.scheduleWithFixedDelay(new Runnable() {         @Override         public void run() {             long start = new Date().getTime();             System.out.println("scheduleWithFixedDelay 開始執(zhí)行時間:" +                     DateFormat.getTimeInstance().format(new Date()));             try {                 Thread.sleep(1000);             } catch (InterruptedException e) {                 e.printStackTrace();             }             long end = new Date().getTime();             System.out.println("scheduleWithFixedDelay執(zhí)行花費時間=" + (end - start) / 1000 + "m");             System.out.println("scheduleWithFixedDelay執(zhí)行完成時間:"                     + DateFormat.getTimeInstance().format(new Date()));             System.out.println("======================================");         }     }, 1, 2, TimeUnit.SECONDS); }

執(zhí)行結(jié)果

Java中線程池的使用場景有哪些

測試二

public static void method_03() {     ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);      executor.scheduleWithFixedDelay(new Runnable() {         @Override         public void run() {             long start = new Date().getTime();             System.out.println("scheduleWithFixedDelay 開始執(zhí)行時間:" +                     DateFormat.getTimeInstance().format(new Date()));             try {                 Thread.sleep(5000);             } catch (InterruptedException e) {                 e.printStackTrace();             }             long end = new Date().getTime();             System.out.println("scheduleWithFixedDelay執(zhí)行花費時間=" + (end - start) / 1000 + "m");             System.out.println("scheduleWithFixedDelay執(zhí)行完成時間:"                     + DateFormat.getTimeInstance().format(new Date()));             System.out.println("======================================");         }     }, 1, 2, TimeUnit.SECONDS); }

執(zhí)行結(jié)果

Java中線程池的使用場景有哪些

總結(jié):同樣的,跟scheduleWithFixedDelay測試方法一樣,可以測出scheduleWithFixedDelay的間隔時間不會受任務(wù)執(zhí)行時間長短的影響。

4、newSingleThreadExecutor

這是一個單線程池,至始至終都由一個線程來執(zhí)行。

public static void method_04() {      ExecutorService executor = Executors.newSingleThreadExecutor();      for (int i = 0; i < 5; i++) {         final int index = i;         executor.execute(() -> {             try {                 Thread.sleep(2 * 1000);             } catch (InterruptedException e) {                 e.printStackTrace();             }             System.out.println(Thread.currentThread().getName() + "   " + index);         });     }     executor.shutdown(); }

執(zhí)行結(jié)果

Java中線程池的使用場景有哪些

四、線程池的作用

線程池的作用主要是為了提升系統(tǒng)的性能以及使用率。文章剛開始就提到,如果我們使用最簡單的方式創(chuàng)建線程,如果用戶量比較大,那么就會產(chǎn)生很多創(chuàng)建和銷毀線程的動作,這會導(dǎo)致服務(wù)器在創(chuàng)建和銷毀線程上消耗的性能可能要比處理實際業(yè)務(wù)花費的時間和性能更多。線程池就是為了解決這種這種問題而出現(xiàn)的。

同樣思想的設(shè)計還有很多,比如數(shù)據(jù)庫連接池,由于頻繁的連接數(shù)據(jù)庫,然而創(chuàng)建連接是一個很消耗性能的事情,所有數(shù)據(jù)庫連接池就出現(xiàn)了。

看完上述內(nèi)容,你們對Java中線程池的使用場景有哪些有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。


本文名稱:Java中線程池的使用場景有哪些
轉(zhuǎn)載源于:
http://weahome.cn/article/ipjjsi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部