最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaEE線程安全實現(xiàn)線程池方法

 更新時間:2022年06月20日 10:45:47   作者:sugar?high  
這篇文章主要介紹了JavaEE線程安全實現(xiàn)線程池方法,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下

前言:

線程雖然比進(jìn)程更輕量,但是如果創(chuàng)建銷毀的頻率進(jìn)一步增加,開銷還是很大

解決方案:線程池or協(xié)程

線程池:把線程提前創(chuàng)建好放到池子里,后續(xù)用到線程直接從池子里取不必這邊申請了。線程用完了也不是還給系統(tǒng)而是放回池子,以備下次再用。

為什么線程放在池子里就比從系統(tǒng)申請釋放來得更快呢?

用戶寫的代碼就是在最上面的應(yīng)用程序來運(yùn)行,這里的代碼都稱為“用戶態(tài)”運(yùn)行的代碼,有些代碼需要調(diào)用API進(jìn)一步的邏輯就會在內(nèi)核中執(zhí)行。在內(nèi)核中執(zhí)行的代碼稱為“內(nèi)核態(tài)”運(yùn)行的代碼。創(chuàng)建線程是在內(nèi)核中創(chuàng)建PCB加到鏈表里,本身就需要內(nèi)核的支持,調(diào)用Thread.start也是要在內(nèi)核態(tài)上運(yùn)行的。而創(chuàng)建好的線程放進(jìn)池子里是用戶態(tài)實現(xiàn)的,這個放進(jìn)池里/從池子里取過程不涉及內(nèi)核態(tài),就是用戶代碼就能完成。一般認(rèn)為純用戶態(tài)的操作效率要比內(nèi)核態(tài)處理的操作效率更高。

java標(biāo)準(zhǔn)庫中的線程池:

ThreadPoolExecutor需要java.util.concurrent包,Java中很多線程相關(guān)的組件都在concurrent包里

線程池構(gòu)造方法:

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

線程池參數(shù)解析:

int corePoolSize 核心線程數(shù)(正式員工的數(shù)量)
int maximumPoolSize 最大線程數(shù)(正式員工+臨時員工)
long keepAliveTime 允許臨時工摸魚的時間
TimeUnit unit 時間的單位(s,ms,us…)
BlockingQueue<Runnable workQueue 任務(wù)隊列(線程池會提供一個submit方法讓程序員把任務(wù)注冊到線程池中,加到這個任務(wù)隊列中)
ThreadFactory threadFactory 線程工廠(線程是怎么創(chuàng)建出來的)
RejectedExecutionHandler handler 拒絕策略
(當(dāng)任務(wù)滿了怎么做?1.直接忽略最新的任務(wù) 2.阻塞等待 3.直接丟棄最老的任務(wù) …)

一個程序要并發(fā)的/多線程的來完成一些任務(wù),如果使用線程池的話這里線程數(shù)量多少合適?

通過測試性能找到合適的值,例如,寫一個服務(wù)器程序通過線程池,多線程處理用戶請求就可以對這個服務(wù)器性能經(jīng)行測試。比如每秒發(fā)送500/1000/2000的請求…
根據(jù)不同線程池的線程數(shù)來觀察程序處理任務(wù)的速度和程序持有的CPU的占用率。當(dāng)線程數(shù)量多了整體速度是會變快但是CPU占用率也會高,當(dāng)線程數(shù)少了整體速度會變慢但是Cpu占用率也會下降。
需要找到一個讓程序速度能接受并且CPU占用也合理的平衡點,不同類型的程序單個任務(wù)在CPU上計算時間和阻塞時間的分布是不相同的,因此不是一個確定的數(shù)字。

簡化版的線程池:

Executors本質(zhì)是針對ThreadPoolExecutor進(jìn)行了封裝提供了一些默認(rèn)參數(shù)。

public class 線程池 {
    public static void main(String[] args) {
        // 創(chuàng)建一個固定線程數(shù)目的線程池. 參數(shù)指定了線程個數(shù)
        ExecutorService pool = Executors.newFixedThreadPool(10);

        //創(chuàng)建一個自動擴(kuò)容的線程池,會根據(jù)任務(wù)量來進(jìn)行自動擴(kuò)容
        Executors.newCachedThreadPool();

        //創(chuàng)建一個只有一個線程的線程池
        Executors.newSingleThreadExecutor();

        //創(chuàng)建一個帶有定時器功能的線程池,類似于Timer
        Executors.newScheduledThreadPool(10);

        for (int i = 0; i < 100; i++) {
            pool.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println("hello threadpool");
                }
            });
        }

    }
}

線程池的組成:

  • 1.先能夠描述任務(wù)(直接使用Runnable)
  • 2.需要組織任務(wù)(直接使用BlockingQueue)
  • 3.能夠描述工作線程
  • 4.還需要組織這些線程
  • 5.需要實現(xiàn)往線程里添加任務(wù)
class MyThreadPool{
    //1.先描述一個任務(wù),直接使用Runnable不需要產(chǎn)生額外類
    //2.使用一個數(shù)據(jù)結(jié)構(gòu)來組織若干任務(wù)
        private BlockingQueue<Runnable> queue= new LinkedBlockingDeque<>();
    //3.描述一個線程,工作線程的功能就是從任務(wù)隊列中取任務(wù)并執(zhí)行
    static class Worker extends Thread{
        //當(dāng)前線程池中有若干個Worker線程,這些線程內(nèi)部都持有了上述的任務(wù)隊列
        private BlockingQueue<Runnable> queue = null;
        public Worker(BlockingQueue<Runnable> queue){
            this.queue = queue;
        }

        @Override
        public void run() {
            //就需要能夠拿到上面的隊列
            while(true){

                try {
                    //循環(huán)的去獲取任務(wù)隊列中的人物
                    //這里如果隊列為空就直接阻塞,如果隊列非空就獲取到里面的內(nèi)容
                    Runnable runnable = queue.take();
                    //獲取到后就執(zhí)行
                    runnable.run();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //4.創(chuàng)建一個數(shù)據(jù)結(jié)構(gòu)來組織若干個線程
    private List<Thread> workers = new ArrayList<>();
    public MyThreadPool(int n){
        //在構(gòu)造方法中創(chuàng)建若干個線程放到上述數(shù)組中
        for (int i = 0; i < n; i++) {
            Worker worker = new Worker(queue);
            worker.start();
            workers.add(worker);
        }
    }

    //5.創(chuàng)建一個方法,能夠允許程序員來放任務(wù)到線程池中
    public void submit(Runnable runnable){
        try {
            queue.put(runnable);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}
public class 我的線程池 {
    public static void main(String[] args) {
        MyThreadPool pool = new MyThreadPool(10);
        for (int i = 0; i < 100; i++) {
            pool.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println("hello threadpool");
                }
            });
        }
    }
}

到此這篇關(guān)于JavaEE線程安全實現(xiàn)線程池方法的文章就介紹到這了,更多相關(guān)JavaEE線程安全 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot與ActiveMQ整合的步驟

    Spring Boot與ActiveMQ整合的步驟

    今天小編就為大家分享一篇關(guān)于Spring Boot與ActiveMQ整合的步驟,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • SpringBoot統(tǒng)一功能處理示例詳解(攔截器)

    SpringBoot統(tǒng)一功能處理示例詳解(攔截器)

    這篇文章主要介紹了SpringBoot統(tǒng)一功能處理(攔截器),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • Java定時器Timer使用方法詳解

    Java定時器Timer使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Java定時器Timer的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • 淺談java什么時候需要用序列化?

    淺談java什么時候需要用序列化?

    本文主要介紹了淺談java什么時候需要用序列化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • java判斷http地址是否連通(示例代碼)

    java判斷http地址是否連通(示例代碼)

    這篇文章通過實例代碼給大家介紹了java判斷http地址是否連通,文末給大家補(bǔ)充知識點url.openconnection() 設(shè)置超時時間的方法,感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • 淺談HashMap在高并發(fā)下的問題

    淺談HashMap在高并發(fā)下的問題

    這篇文章主要介紹了HashMap在高并發(fā)下的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java基于二分搜索樹、鏈表的實現(xiàn)的集合Set復(fù)雜度分析實例詳解

    Java基于二分搜索樹、鏈表的實現(xiàn)的集合Set復(fù)雜度分析實例詳解

    這篇文章主要介紹了Java基于二分搜索樹、鏈表的實現(xiàn)的集合Set復(fù)雜度分析,結(jié)合實例形式詳細(xì)分析了Java基于二分搜索樹、鏈表的實現(xiàn)的集合Set復(fù)雜度分析相關(guān)操作技巧與注意事項,需要的朋友可以參考下
    2020-03-03
  • Spring Boot系列教程之日志配置

    Spring Boot系列教程之日志配置

    這篇文章主要給大家介紹了關(guān)于Spring Boot系列教程之日志配置的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • IDEA實現(xiàn)JDBC的操作步驟

    IDEA實現(xiàn)JDBC的操作步驟

    JDBC提供了一種基準(zhǔn),據(jù)此可以構(gòu)建更高級的工具和接口,使數(shù)據(jù)庫開發(fā)人員能夠編寫數(shù)據(jù)庫應(yīng)用程序,本文給大家介紹IDEA實現(xiàn)JDBC的操作步驟,感興趣的朋友一起看看吧
    2022-01-01
  • Spring的@PropertySource注解源碼解析

    Spring的@PropertySource注解源碼解析

    這篇文章主要介紹了Spring的@PropertySource注解源碼解析,就以源碼時序圖的方式,直觀的感受下@PropertySource注解在Spring源碼層面的執(zhí)行流程,需要的朋友可以參考下
    2023-11-11

最新評論

临泽县| 塔城市| 扎兰屯市| 大新县| 邢台市| 兴义市| 青河县| 白银市| 轮台县| 谢通门县| 彭阳县| 宁陕县| 枣强县| 滨海县| 绍兴县| 益阳市| 那坡县| 宁国市| 交口县| 类乌齐县| 南投县| 临夏县| 钟山县| 阿巴嘎旗| 民勤县| 太仓市| 栾城县| 临澧县| 大厂| 株洲县| 高碑店市| 嵩明县| 临泉县| 南溪县| 屯留县| 邛崃市| 富裕县| 昭平县| 金昌市| 津南区| 铁岭县|