成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

java線(xiàn)程池

233jl / 1239人閱讀

摘要:本篇來(lái)看下線(xiàn)程池相關(guān)技術(shù)的實(shí)現(xiàn)和使用方式。時(shí)間單位這個(gè)線(xiàn)程池中線(xiàn)程處理任務(wù)的的任務(wù)隊(duì)列。上面的例子中我們向線(xiàn)程池中提交了一個(gè),并接受一個(gè)返回值。

本篇來(lái)看下java線(xiàn)程池相關(guān)技術(shù)的實(shí)現(xiàn)和使用方式。

0x01 線(xiàn)程的實(shí)現(xiàn)

一開(kāi)始我們想要實(shí)現(xiàn)多線(xiàn)程最通常的做法是:

new Thread(new Runnable() {
    public void run() {
        System.out.println("raw thread");
    }
}).start();

這種方式,這種實(shí)現(xiàn)方式也沒(méi)有什么不好,只是如果線(xiàn)程一多的話(huà)不好對(duì)所有的線(xiàn)程進(jìn)行統(tǒng)一管理。然后java有了線(xiàn)程池技術(shù),我們可以通過(guò)線(xiàn)程池技術(shù)來(lái)替換實(shí)現(xiàn)上面的方式。

0x02 線(xiàn)程池
ExecutorService executorPool = Executors.newCachedThreadPool();
Future future = executorPool.submit(new Callable() {
    public String call() throws Exception {
        return "future finish";
    }
});
try {
    System.out.println(future.get());
} catch (Exception e) {
    e.printStackTrace();
}

Executors有如下幾種方式創(chuàng)建線(xiàn)程:

newCachedThreadPool

newFixedThreadPool

newScheduledThreadPool

上面三種方式最終都是調(diào)用ThreadPoolExecutor的構(gòu)造函數(shù)進(jìn)行線(xiàn)程池的創(chuàng)建,只是傳入的參數(shù)不一樣,而實(shí)現(xiàn)不同的線(xiàn)程池對(duì)象。

ThreadPoolExecutor(int corePoolSize,
                      int maximumPoolSize,
                      long keepAliveTime,
                      TimeUnit unit,
                      BlockingQueue workQueue,
                      ThreadFactory threadFactory,
                      RejectedExecutionHandler handler)

corePoolSize:創(chuàng)建線(xiàn)程池時(shí)創(chuàng)建多少個(gè)線(xiàn)程。

maximumPoolSize:這個(gè)線(xiàn)程池中對(duì)多能有多少個(gè)線(xiàn)程。

keepAliveTime:當(dāng)線(xiàn)程數(shù)量超過(guò)corePoolSize時(shí),多余的空閑線(xiàn)程最大的存活時(shí)間。也就是說(shuō)多余的線(xiàn)程在keepAliveTime時(shí)間還是沒(méi)有處理任何的任務(wù)將會(huì)被終止。

unit:時(shí)間單位

workQueue:這個(gè)線(xiàn)程池中線(xiàn)程處理任務(wù)的的任務(wù)隊(duì)列。

threadFactory:創(chuàng)建新線(xiàn)程的線(xiàn)程工廠。

handler:當(dāng)線(xiàn)程數(shù)量達(dá)到maximumPoolSize,對(duì)新加入的任務(wù)的處理策略。一般很少使用這個(gè)參數(shù)基本都采用默認(rèn)的handler。

上面的例子中我們向線(xiàn)程池中提交了一個(gè)Callable,并接受一個(gè)返回值Future。Callable可能會(huì)是一個(gè)非常耗時(shí)的操作但是使用方有不想阻塞等待其返回再繼續(xù)執(zhí)行,這時(shí)Callable執(zhí)行完后會(huì)將結(jié)果放到Future中,使用方可以在需要的時(shí)候去判斷是否Callable已經(jīng)執(zhí)行完成,如果完成就可以通過(guò)Future拿到其返回值。

0x03 ScheduledExecutorService

任務(wù)定時(shí)調(diào)度線(xiàn)程的使用:

        ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
        scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
            public void run() {
                System.out.println("schedule task with fixed rate:" + System.currentTimeMillis());
            }
        }, 2000, 1000, TimeUnit.MILLISECONDS);

        scheduledExecutorService.scheduleWithFixedDelay(new Runnable() {
            public void run() {
                System.out.println("schedule task with fixed delay:" + System.currentTimeMillis());
                int count = Integer.MAX_VALUE;
                while (count-- > 0){

                }
                System.out.println("time:" + System.currentTimeMillis());
            }
        }, 2000, 1000, TimeUnit.MILLISECONDS);

ScheduledExecutorService有兩種定時(shí)調(diào)度的方式:

scheduleAtFixedRate:以固定速率進(jìn)行調(diào)度,意思是任何兩個(gè)被調(diào)度的任務(wù)之間的時(shí)間間隔是固定的。第二個(gè)任務(wù)的調(diào)度時(shí)間(開(kāi)始執(zhí)行時(shí)間)= 第一個(gè)任務(wù)的調(diào)度時(shí)間 + 間隔時(shí)間

scheduleWithFixedDelay:第二個(gè)任務(wù)的調(diào)度時(shí)間 = 第一個(gè)任務(wù)的調(diào)度時(shí)間 + 第一個(gè)任務(wù)的執(zhí)行時(shí)間 + 間隔時(shí)間

0x04 Timer定時(shí)任務(wù)

上面介紹了ScheduledExecutorService來(lái)做定時(shí)任務(wù),在編程的過(guò)程中還可以使用Timer來(lái)做定時(shí)任務(wù),代碼如下:

    timer.scheduleAtFixedRate(new TimerTask() {

            @Override
            public void run() {
                try {
                    doSomething();
                } catch (Exception e) {
                    System.out.println("timer excute exception", e);
                }
            }
        }, 1000 * 3, 1000);

其第一參數(shù)是一個(gè)TimerTask,第二第三個(gè)參數(shù)scheduledExecutorService.scheduleAtFixedRate這個(gè)調(diào)用的第二三個(gè)參數(shù)一致。

0x05 參考

我覺(jué)得最好的參考還是閱讀相關(guān)源碼去理解Executor的使用方式,這樣自己才能理解的比較深入同時(shí)做到活學(xué)活用。
線(xiàn)程池的的核心實(shí)現(xiàn)ThreadPoolExecutor,想了解更多還是自己去look look源碼吧。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66217.html

相關(guān)文章

  • Java線(xiàn)程

    摘要:中的線(xiàn)程池是運(yùn)用場(chǎng)景最多的并發(fā)框架。才是真正的線(xiàn)程池。存放任務(wù)的隊(duì)列存放需要被線(xiàn)程池執(zhí)行的線(xiàn)程隊(duì)列。所以線(xiàn)程池的所有任務(wù)完成后,它最終會(huì)收縮到的大小。飽和策略一般情況下,線(xiàn)程池采用的是,表示無(wú)法處理新任務(wù)時(shí)拋出異常。 Java線(xiàn)程池 1. 簡(jiǎn)介 系統(tǒng)啟動(dòng)一個(gè)新線(xiàn)程的成本是比較高的,因?yàn)樗婕芭c操作系統(tǒng)的交互,這個(gè)時(shí)候使用線(xiàn)程池可以提升性能,尤其是需要?jiǎng)?chuàng)建大量聲明周期很短暫的線(xiàn)程時(shí)。Ja...

    jerry 評(píng)論0 收藏0
  • 后端ing

    摘要:當(dāng)活動(dòng)線(xiàn)程核心線(xiàn)程非核心線(xiàn)程達(dá)到這個(gè)數(shù)值后,后續(xù)任務(wù)將會(huì)根據(jù)來(lái)進(jìn)行拒絕策略處理。線(xiàn)程池工作原則當(dāng)線(xiàn)程池中線(xiàn)程數(shù)量小于則創(chuàng)建線(xiàn)程,并處理請(qǐng)求。當(dāng)線(xiàn)程池中的數(shù)量等于最大線(xiàn)程數(shù)時(shí)默默丟棄不能執(zhí)行的新加任務(wù),不報(bào)任何異常。 spring-cache使用記錄 spring-cache的使用記錄,坑點(diǎn)記錄以及采用的解決方案 深入分析 java 線(xiàn)程池的實(shí)現(xiàn)原理 在這篇文章中,作者有條不紊的將 ja...

    roadtogeek 評(píng)論0 收藏0
  • java 四種線(xiàn)程的使用

    摘要:四種線(xiàn)程池的使用介紹的弊端及四種線(xiàn)程池的使用,線(xiàn)程池的作用線(xiàn)程池作用就是限制系統(tǒng)中執(zhí)行線(xiàn)程的數(shù)量。相比,提供的四種線(xiàn)程池的好處在于重用存在的線(xiàn)程,減少對(duì)象創(chuàng)建消亡的開(kāi)銷(xiāo),性能佳。延遲執(zhí)行描述創(chuàng)建一個(gè)定長(zhǎng)線(xiàn)程池,支持定時(shí)及周期性任務(wù)執(zhí)行。 java 四種線(xiàn)程池的使用 介紹new Thread的弊端及Java四種線(xiàn)程池的使用 1,線(xiàn)程池的作用 線(xiàn)程池作用就是限制系統(tǒng)中執(zhí)行線(xiàn)程的數(shù)量。 ...

    gggggggbong 評(píng)論0 收藏0
  • Java 線(xiàn)程

    系統(tǒng)啟動(dòng)一個(gè)線(xiàn)程的成本是比較高,使用線(xiàn)程池可以很好地提高性能,尤其是當(dāng)程序中需要?jiǎng)?chuàng)建大量生存期很短暫的線(xiàn)程時(shí) 線(xiàn)程池在系統(tǒng)啟動(dòng)時(shí)即創(chuàng)建大量空閑線(xiàn)程,將一個(gè)Runnable、Callable對(duì)象—–>傳給線(xiàn)程池—–>線(xiàn)程池啟動(dòng)里面的一個(gè)線(xiàn)程來(lái)執(zhí)行它們的run()或者call()方法———->當(dāng)線(xiàn)程執(zhí)行體執(zhí)行完成后,線(xiàn)程并不會(huì)死亡,而是再次返回線(xiàn)程池成為空閑狀態(tài),等待下一個(gè)Runnable、Calla...

    ctriptech 評(píng)論0 收藏0
  • 跟著阿里p7一起學(xué)java高并發(fā) - 第18天:玩轉(zhuǎn)java線(xiàn)程,這一篇就夠了

    摘要:高并發(fā)系列第篇文章。簡(jiǎn)單的說(shuō),在使用了線(xiàn)程池之后,創(chuàng)建線(xiàn)程變成了從線(xiàn)程池中獲取一個(gè)空閑的線(xiàn)程,然后使用,關(guān)閉線(xiàn)程變成了將線(xiàn)程歸還到線(xiàn)程池。如果調(diào)用了線(xiàn)程池的方法,線(xiàn)程池會(huì)提前把核心線(xiàn)程都創(chuàng)造好,并啟動(dòng)線(xiàn)程池允許創(chuàng)建的最大線(xiàn)程數(shù)。 java高并發(fā)系列第18篇文章。 本文主要內(nèi)容 什么是線(xiàn)程池 線(xiàn)程池實(shí)現(xiàn)原理 線(xiàn)程池中常見(jiàn)的各種隊(duì)列 自定義線(xiàn)程創(chuàng)建的工廠 常見(jiàn)的飽和策略 自定義飽和策略 ...

    AdolphLWQ 評(píng)論0 收藏0
  • Java中的線(xiàn)程

    摘要:中的線(xiàn)程池運(yùn)用場(chǎng)景非常廣泛,幾乎所有的一步或者并發(fā)執(zhí)行程序都可以使用。代碼中如果執(zhí)行了方法,線(xiàn)程池會(huì)提前創(chuàng)建并啟動(dòng)所有核心線(xiàn)程。線(xiàn)程池最大數(shù)量線(xiàn)程池允許創(chuàng)建的線(xiàn)程最大數(shù)量。被稱(chēng)為是可重用固定線(xiàn)程數(shù)的線(xiàn)程池。 Java中的線(xiàn)程池運(yùn)用場(chǎng)景非常廣泛,幾乎所有的一步或者并發(fā)執(zhí)行程序都可以使用。那么線(xiàn)程池有什么好處呢,以及他的實(shí)現(xiàn)原理是怎么樣的呢? 使用線(xiàn)程池的好處 在開(kāi)發(fā)過(guò)程中,合理的使用線(xiàn)程...

    tomato 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<