成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

并發(fā)學(xué)習(xí)筆記 (6)

superw / 1661人閱讀

摘要:每個(gè)通過(guò)網(wǎng)絡(luò)到達(dá)服務(wù)器的連接都被包裝成一個(gè)任務(wù)并且傳遞給線程池。線程池的線程會(huì)并發(fā)的處理連接上的請(qǐng)求。用線程池控制線程數(shù)量,其他線程排隊(duì)等候。實(shí)現(xiàn)包,線程池頂級(jí)接口是但是嚴(yán)格意義講并不是一個(gè)線程。此線程池支持定時(shí)以及周期性執(zhí)行任務(wù)的需求。

tutorial site1
tutorial site2

一個(gè)問(wèn)題:

每啟動(dòng)一個(gè)新線程都會(huì)有相應(yīng)的性能開(kāi)銷(涉及到OS的交互:創(chuàng)建線程,銷毀線程),而且每個(gè)線程都需要給棧分配一些內(nèi)存等等。這種代價(jià)隨著新線程不斷的創(chuàng)建,將會(huì)大大降低性能甚至使JVM崩潰。

如何解決?
使線程可以復(fù)用,執(zhí)行完一個(gè)任務(wù),并不被銷毀,而是可以繼續(xù)執(zhí)行其他的任務(wù)。這樣避免了創(chuàng)建以及銷毀線程的代價(jià)以及線程過(guò)多造成內(nèi)存消耗過(guò)度以及切換過(guò)度問(wèn)題。

線程池 何為線程池

線程池(Thread Pool)的引入就是:限制應(yīng)用程序中同一時(shí)刻運(yùn)行的線程數(shù)。根據(jù)系統(tǒng)的環(huán)境,可以手動(dòng)或者自動(dòng)設(shè)置線程數(shù)量,達(dá)到最佳效果。

可以把并發(fā)執(zhí)行的任務(wù)傳遞給一個(gè)線程池,來(lái)替代為每個(gè)并發(fā)執(zhí)行的任務(wù)都啟動(dòng)一個(gè)新的線程。只要池里有空閑的線程,任務(wù)就會(huì)分配給一個(gè)線程執(zhí)行。 在線程池的內(nèi)部,任務(wù)被插入一個(gè)阻塞隊(duì)列(任務(wù)隊(duì)列), 線程池的線程會(huì)去取這個(gè)隊(duì)列的任務(wù)。當(dāng)一個(gè)新任務(wù)插入隊(duì)列時(shí),一個(gè)空閑線程就會(huì)成功的從隊(duì)列中取出任務(wù)并執(zhí)行它。

線程池經(jīng)常應(yīng)用在多線程服務(wù)器上。每個(gè)通過(guò)網(wǎng)絡(luò)到達(dá)服務(wù)器的連接都被包裝成一個(gè)任務(wù)并且傳遞給線程池。線程池的線程會(huì)并發(fā)的處理連接上的請(qǐng)求。Java 5 在 java.util.concurrent 包中自帶了內(nèi)置的線程池,所以你不用非得實(shí)現(xiàn)自己的線程池。

好處

線程池的作用:
合理利用線程池能夠帶來(lái)三個(gè)好處。
第一:降低資源消耗。通過(guò)重復(fù)利用已創(chuàng)建的線程降低線程創(chuàng)建和銷毀造成的消耗。
第二:提高響應(yīng)速度。當(dāng)任務(wù)到達(dá)時(shí),任務(wù)可以不需要等到線程創(chuàng)建就能立即執(zhí)行。
第三:提高線程的可管理性。線程是稀缺資源,如果無(wú)限制的創(chuàng)建,不僅會(huì)消耗系統(tǒng)資源,還會(huì)降低系統(tǒng)的穩(wěn)定性,使用線程池可以進(jìn)行統(tǒng)一的分配,調(diào)優(yōu)和監(jiān)控。但是要做到合理的利用線程池,必須對(duì)其原理了如指掌。

線程池實(shí)現(xiàn)了系統(tǒng)中線程的數(shù)量。
根據(jù)系統(tǒng)的環(huán)境情況,可以自動(dòng)或手動(dòng)設(shè)置線程數(shù)量,達(dá)到運(yùn)行的最佳效果;少了浪費(fèi)了系統(tǒng)資源,多了造成系統(tǒng)擁擠效率不高。用線程池控制線程數(shù)量,其他線程排隊(duì)等候。一個(gè)任務(wù)執(zhí)行完畢,再?gòu)年?duì)列的中取最前面的任務(wù)開(kāi)始執(zhí)行。若隊(duì)列中沒(méi)有等待進(jìn)程,線程池的這一資源處于等待。當(dāng)一個(gè)新任務(wù)需要運(yùn)行時(shí),如果線程池中有等待的工作線程,就可以開(kāi)始運(yùn)行了;否則進(jìn)入等待隊(duì)列。

實(shí)現(xiàn)

JUC 包,線程池頂級(jí)接口是Executor. 但是嚴(yán)格意義講Executor并不是一個(gè)線程。 而只是一個(gè)執(zhí)行線程的工具。真正的線程池的接口是ExecutorService.

ExecutorService 真正的線程池的接口
ScheduledExecutorService 能和Timer/TimerTask類似,解決那些需要任務(wù)重復(fù)執(zhí)行的問(wèn)題 
ThreadPoolExecutor ExecutorService的默認(rèn)實(shí)現(xiàn)
ScheduledThreadPoolExecutor 繼承 ThreadPoolExecutor 的 ScheduledExecutorService 接口實(shí)現(xiàn),周期性任務(wù)調(diào)度的類實(shí)現(xiàn)

要配置一個(gè)線程池是比較復(fù)雜的,尤其是對(duì)于線程池的原理不是很清楚的情況下,很有可能配置的線程池不是較優(yōu)的,因此在 Executors 類里面提供了一些靜態(tài)工廠,生成一些常用的線程池。
1. newSingleThreadExecutor()
創(chuàng)建一個(gè)單線程的線程池。這個(gè)線程池只有一個(gè)線程在工作,也就是相當(dāng)于單線程串行執(zhí)行所有任務(wù)。如果這個(gè)唯一的線程因?yàn)楫惓=Y(jié)束,那么會(huì)有一個(gè)新的線程來(lái)替代它。此線程池保證所有任務(wù)的執(zhí)行順序按照任務(wù)的提交順序執(zhí)行。

javapublic classMyThread extends Thread {
    publicvoid run() {
        System.out.println(Thread.currentThread().getName() + " 正在執(zhí)行。。。");
    }
}

public classTestSingleThreadExecutor {
    public static void main(String[] args) {
        // 創(chuàng)建一個(gè)可重用固定線程數(shù)的線程池
        ExecutorService pool = Executors.newSingleThreadExecutor();
        // 創(chuàng)建實(shí)現(xiàn)了 Runnable 接口對(duì)象,Thread 對(duì)象當(dāng)然也實(shí)現(xiàn)了 Runnable 接口
        Thread t1 = new MyThread();
        Thread t2 = new MyThread();
        Thread t3 = new MyThread();
        Thread t4 = new MyThread();
        Thread t5 = new MyThread();
        // 將線程放入池中進(jìn)行執(zhí)行
        pool.execute(t1);
        pool.execute(t2);
        pool.execute(t3);
        pool.execute(t4);
        pool.execute(t5);
        // 關(guān)閉線程池
        pool.shutdown();
    }
}

2.newFixedThreadPool()
創(chuàng)建固定大小的線程池。每次提交一個(gè)任務(wù)就創(chuàng)建一個(gè)線程,直到線程達(dá)到線程池的最大大小。線程池的大小一旦達(dá)到最大值就會(huì)保持不變,如果某個(gè)線程因?yàn)閳?zhí)行異常而結(jié)束,那么線程池會(huì)補(bǔ)充一個(gè)新線程。

javapublicclass TestFixedThreadPool {
    publicstaticvoid main(String[] args) {
        // 創(chuàng)建一個(gè)可重用固定線程數(shù)的線程池
        ExecutorService pool = Executors.newFixedThreadPool(2);
        // 創(chuàng)建實(shí)現(xiàn)了 Runnable 接口對(duì)象,Thread 對(duì)象當(dāng)然也實(shí)現(xiàn)了 Runnable 接口
        Thread t1 = new MyThread();
        Thread t2 = new MyThread();
        Thread t3 = new MyThread();
        Thread t4 = new MyThread();
        Thread t5 = new MyThread();
        // 將線程放入池中進(jìn)行執(zhí)行
        pool.execute(t1);
        pool.execute(t2);
        pool.execute(t3);
        pool.execute(t4);
        pool.execute(t5);
        // 關(guān)閉線程池
        pool.shutdown();
    }
}

newCachedThreadPool
創(chuàng)建一個(gè)可緩存的線程池。如果線程池的大小超過(guò)了處理任務(wù)所需要的線程,
那么就會(huì)回收部分空閑(60 秒不執(zhí)行任務(wù))的線程,當(dāng)任務(wù)數(shù)增加時(shí),此線程池又可以智能的添加新線程來(lái)處理任務(wù)。此線程池不會(huì)對(duì)線程池大小做限制,線程池大小完全依賴于操作系統(tǒng)(或者說(shuō) JVM)能夠創(chuàng)建的最大線程大小。

javapublicclass TestCachedThreadPool {
    publicstaticvoid main(String[] args) {
        // 創(chuàng)建一個(gè)可重用固定線程數(shù)的線程池
        ExecutorService pool = Executors.newCachedThreadPool();
        // 創(chuàng)建實(shí)現(xiàn)了 Runnable 接口對(duì)象,Thread 對(duì)象當(dāng)然也實(shí)現(xiàn)了 Runnable 接口
        Thread t1 = new MyThread();
        Thread t2 = new MyThread();
        Thread t3 = new MyThread();
        Thread t4 = new MyThread();
        Thread t5 = new MyThread();
        // 將線程放入池中進(jìn)行執(zhí)行
        pool.execute(t1);
        pool.execute(t2);
        pool.execute(t3);
        pool.execute(t4);
        pool.execute(t5);
        // 關(guān)閉線程池
        pool.shutdown();
    }
}

4.newScheduledThreadPool
創(chuàng)建一個(gè)大小無(wú)限的線程池。此線程池支持定時(shí)以及周期性執(zhí)行任務(wù)的需求。

javapublicclass TestScheduledThreadPoolExecutor {
    publicstaticvoid main(String[] args) {
        ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
        exec.scheduleAtFixedRate(new Runnable() {// 每隔一段時(shí)間就觸發(fā)異常
                      @Override
                      publicvoid run() {
                           //throw new RuntimeException();
                           System.out.println("================");
                      }
                  }, 1000, 5000, TimeUnit.MILLISECONDS);
        exec.scheduleAtFixedRate(new Runnable() {// 每隔一段時(shí)間打印系統(tǒng)時(shí)間,證明兩者是互不影響的
                      @Override
                      publicvoid run() {
                           System.out.println(System.nanoTime());
                      }
                  }, 1000, 2000, TimeUnit.MILLISECONDS);
    }
}

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/64364.html

相關(guān)文章

  • Python入門學(xué)習(xí)筆記匯總

    摘要:導(dǎo)語(yǔ)本文章匯總了本人在學(xué)習(xí)基礎(chǔ)之緒論篇數(shù)據(jù)結(jié)構(gòu)篇函數(shù)篇面向?qū)ο笃刂屏鞒唐驮幊唐獙W(xué)習(xí)筆記的鏈接,打算入門的朋友們可以按需查看并交流。 導(dǎo)語(yǔ):本文章匯總了本人在學(xué)習(xí)Python基礎(chǔ)之緒論篇、數(shù)據(jù)結(jié)構(gòu)篇、函數(shù)篇、面向?qū)ο笃?、控制流程篇和元編程篇學(xué)習(xí)筆記的鏈接,打算入門Python的朋友們可以按需查看并交流。 第一部分:緒論篇 1、Python數(shù)據(jù)模型 第二部分:數(shù)據(jù)結(jié)構(gòu)篇 2、序列構(gòu)成...

    U2FsdGVkX1x 評(píng)論0 收藏0
  • 后臺(tái)開(kāi)發(fā)常問(wèn)面試題集錦(問(wèn)題搬運(yùn)工,附鏈接)

    摘要:基礎(chǔ)問(wèn)題的的性能及原理之區(qū)別詳解備忘筆記深入理解流水線抽象關(guān)鍵字修飾符知識(shí)點(diǎn)總結(jié)必看篇中的關(guān)鍵字解析回調(diào)機(jī)制解讀抽象類與三大特征時(shí)間和時(shí)間戳的相互轉(zhuǎn)換為什么要使用內(nèi)部類對(duì)象鎖和類鎖的區(qū)別,,優(yōu)缺點(diǎn)及比較提高篇八詳解內(nèi)部類單例模式和 Java基礎(chǔ)問(wèn)題 String的+的性能及原理 java之yield(),sleep(),wait()區(qū)別詳解-備忘筆記 深入理解Java Stream流水...

    spacewander 評(píng)論0 收藏0
  • 后臺(tái)開(kāi)發(fā)常問(wèn)面試題集錦(問(wèn)題搬運(yùn)工,附鏈接)

    摘要:基礎(chǔ)問(wèn)題的的性能及原理之區(qū)別詳解備忘筆記深入理解流水線抽象關(guān)鍵字修飾符知識(shí)點(diǎn)總結(jié)必看篇中的關(guān)鍵字解析回調(diào)機(jī)制解讀抽象類與三大特征時(shí)間和時(shí)間戳的相互轉(zhuǎn)換為什么要使用內(nèi)部類對(duì)象鎖和類鎖的區(qū)別,,優(yōu)缺點(diǎn)及比較提高篇八詳解內(nèi)部類單例模式和 Java基礎(chǔ)問(wèn)題 String的+的性能及原理 java之yield(),sleep(),wait()區(qū)別詳解-備忘筆記 深入理解Java Stream流水...

    xfee 評(píng)論0 收藏0
  • 后臺(tái)開(kāi)發(fā)常問(wèn)面試題集錦(問(wèn)題搬運(yùn)工,附鏈接)

    摘要:基礎(chǔ)問(wèn)題的的性能及原理之區(qū)別詳解備忘筆記深入理解流水線抽象關(guān)鍵字修飾符知識(shí)點(diǎn)總結(jié)必看篇中的關(guān)鍵字解析回調(diào)機(jī)制解讀抽象類與三大特征時(shí)間和時(shí)間戳的相互轉(zhuǎn)換為什么要使用內(nèi)部類對(duì)象鎖和類鎖的區(qū)別,,優(yōu)缺點(diǎn)及比較提高篇八詳解內(nèi)部類單例模式和 Java基礎(chǔ)問(wèn)題 String的+的性能及原理 java之yield(),sleep(),wait()區(qū)別詳解-備忘筆記 深入理解Java Stream流水...

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

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

0條評(píng)論

閱讀需要支付1元查看
<