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

java中的異步加載new Thread()方式

 更新時(shí)間:2023年08月28日 16:13:50   作者:TJkaklf  
這篇文章主要介紹了java中的異步加載new Thread()方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

java的異步加載new Thread()

public class LoginInterface{
? ?public String delSession(){
? ? new Thread(new Runnable() { @Override public void run() { //需要執(zhí)行的代碼 } }).start();
? ?}}

使用匿名內(nèi)部類(lèi)編譯

class LoginInterface$1
? implements Runnable
{
? LoginInterface$1(LoginInterface paramLoginInterface, String paramString)
? {
? }
? public void run()
? {
//要執(zhí)行的代碼
? }
}

聊聊new Thread()的危害

危害

1)開(kāi)銷(xiāo)大

每次new Thread() 都會(huì)創(chuàng)建新的對(duì)象,開(kāi)銷(xiāo)較大,無(wú)法復(fù)用增加垃圾回收的負(fù)擔(dān)。

2)管理困難

每個(gè)new Thread() 都是獨(dú)立的個(gè)體,無(wú)法有效的管控,無(wú)限制創(chuàng)建相互競(jìng)爭(zhēng),可能導(dǎo)致oom或者核心業(yè)務(wù)線程阻塞。

3)功能單一

無(wú)法定時(shí)執(zhí)行,中斷線程等功能。

線程池

1)復(fù)用已創(chuàng)建的線程,減少對(duì)象創(chuàng)建、消亡的開(kāi)銷(xiāo),性能佳。

2)可控制最大并發(fā)線程數(shù),提高系統(tǒng)資源的使用率,同時(shí)避免過(guò)多資源競(jìng)爭(zhēng),避免堵塞。

3)可定時(shí)執(zhí)行、中斷線程等功能。

線程池大小

1)CPU密集型(計(jì)算型)

  • 使用較小的線程池,一般是Cpu核心數(shù)+1
  • 因?yàn)镃PU密集型任務(wù)CPU的使用率很高,若開(kāi)過(guò)多的線程,只能增加線程上下文的切換次數(shù),帶來(lái)額外的開(kāi)銷(xiāo)

2)IO密集型(查詢?cè)L問(wèn)型)

  • 使用較大的線程池,一般CPU核心數(shù) * 2
  • 因?yàn)镮O密集型CPU使用率不高,可以讓CPU等待IO的時(shí)候處理別的任務(wù),充分利用cpu時(shí)間

線程池創(chuàng)建【使用ThreadPoolExecutor手動(dòng)創(chuàng)建】

public class CommonThreadPool {
    /**
     * 線程池對(duì)象
     */
    public static ExecutorService pool = null;
    /**
     * 線程池核心池的大小
     */
    private static final int CORE_POOL_SIZE = 5;
    /**
     * 獲取當(dāng)前系統(tǒng)的CPU 數(shù)目
     */
    private static int cpuNums = Runtime.getRuntime().availableProcessors();
    /**
     * 線程池的最大線程數(shù)
     */
    private static final int MAX_POOL_SIZE = (cpuNums * 2) > CORE_POOL_SIZE ? (cpuNums * 2) : CORE_POOL_SIZE;
    static {
        pool = new ThreadPoolExecutor(
                CORE_POOL_SIZE,             // 核心線程數(shù)
                MAX_POOL_SIZE,              // 最大線程數(shù) 通常核心線程數(shù)=最大線程數(shù) 當(dāng)MAX_POOL_SIZE > CORE_POOL_SIZE 時(shí),并不是當(dāng)核心線程全部被占用后立馬開(kāi)始創(chuàng)建新的線程(只有在隊(duì)列也滿了之后才會(huì)開(kāi)始新建線程)
                0L,            // 存活時(shí)間   >=0 0 永不回收【非核心線程除外】
                TimeUnit.MILLISECONDS,      // 單位
                new ArrayBlockingQueue<Runnable>(100),                          // 隊(duì)列 存放待執(zhí)行任務(wù)
                new ThreadFactoryBuilder().setNameFormat("CommonThread-%d").build(),    // 創(chuàng)建工廠
                new ThreadPoolExecutor.AbortPolicy());                                  // 拒絕策略 默認(rèn)拒絕 丟棄 丟棄最老的 主線程執(zhí)行
    }
}

禁用Executors創(chuàng)建線程池

1)Executors屏蔽的線程池的內(nèi)部實(shí)現(xiàn)細(xì)節(jié),開(kāi)發(fā)人員需要根據(jù)服務(wù)器情況與業(yè)務(wù)場(chǎng)景定義更合適的線程池。

2)newFixedThreadPool 和 newSingleThreadExecutor的主要問(wèn)題是堆積的請(qǐng)求處理隊(duì)列可能會(huì)耗費(fèi)非常大的內(nèi)存,甚至 OOM。

    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }
    public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }

3)newCachedThreadPool 和 newScheduledThreadPool:主要問(wèn)題是線程數(shù)最大數(shù)是 Integer.MAX_VALUE,可能會(huì)創(chuàng)建數(shù)量非常多的線程,甚至 OOM。

    public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }
    public ScheduledThreadPoolExecutor(int corePoolSize) {
        super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
              new DelayedWorkQueue());
    }
  • LinkedBlockingQueue:隊(duì)列默認(rèn)大小Integer.MAX_VALUE,未指定大小時(shí)可以視為無(wú)界隊(duì)列。
  • SynchronousQueue:隊(duì)列大容量為0,不存儲(chǔ)任何數(shù)據(jù)。
  • DelayedWorkQueue:無(wú)界,隊(duì)列順序按照延時(shí)時(shí)長(zhǎng)排序。

任務(wù)執(zhí)行流程

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java實(shí)現(xiàn)的微信公眾號(hào)獲取微信用戶信息示例

    Java實(shí)現(xiàn)的微信公眾號(hào)獲取微信用戶信息示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的微信公眾號(hào)獲取微信用戶信息,結(jié)合實(shí)例形式分析了Java微信公眾號(hào)獲取微信用戶信息相關(guān)原理、步驟與操作注意事項(xiàng),需要的朋友可以參考下
    2019-10-10
  • Spring?Boot自動(dòng)配置源碼實(shí)例解析

    Spring?Boot自動(dòng)配置源碼實(shí)例解析

    Spring Boot作為Java領(lǐng)域最為流行的快速開(kāi)發(fā)框架之一,其核心特性之一就是其強(qiáng)大的自動(dòng)配置機(jī)制,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot自動(dòng)配置源碼的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • 選擇java的理由:java之父訪談實(shí)錄

    選擇java的理由:java之父訪談實(shí)錄

    選擇java的理由:java之父訪談實(shí)錄...
    2006-12-12
  • OAuth2生成token代碼備忘實(shí)現(xiàn)過(guò)程示例

    OAuth2生成token代碼備忘實(shí)現(xiàn)過(guò)程示例

    這篇文章主要為大家介紹了OAuth2生成token代碼備忘實(shí)現(xiàn)過(guò)程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 詳解Java中的線程池

    詳解Java中的線程池

    這篇文章主要介紹了Java中的線程池,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 教你用JAVA寫(xiě)文本編輯器(四)

    教你用JAVA寫(xiě)文本編輯器(四)

    這篇文章主要給大家介紹了關(guān)于用JAVA寫(xiě)文本編輯器的相關(guān)資料,通過(guò)這篇文章你可以完整的知道利用JAVA寫(xiě)文本編輯器的完整過(guò)程,需要的朋友可以參考下
    2021-11-11
  • Spring中的事務(wù)管理實(shí)例詳解

    Spring中的事務(wù)管理實(shí)例詳解

    這篇文章主要介紹了Spring中的事務(wù)管理,以實(shí)例形式詳細(xì)分析了事務(wù)的概念與特性以及事物管理的具體用法,需要的朋友可以參考下
    2014-11-11
  • java如何刪除以逗號(hào)隔開(kāi)的字符串中某一個(gè)值

    java如何刪除以逗號(hào)隔開(kāi)的字符串中某一個(gè)值

    這篇文章主要介紹了java如何刪除以逗號(hào)隔開(kāi)的字符串中某一個(gè)值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • java中的數(shù)學(xué)計(jì)算函數(shù)的總結(jié)

    java中的數(shù)學(xué)計(jì)算函數(shù)的總結(jié)

    這篇文章主要介紹了java中的數(shù)學(xué)計(jì)算函數(shù)的總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Java實(shí)現(xiàn)字符串的分割(基于String.split()方法)

    Java實(shí)現(xiàn)字符串的分割(基于String.split()方法)

    Java中的我們可以利用split把字符串按照指定的分割符進(jìn)行分割,然后返回字符串?dāng)?shù)組,下面這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)字符串的分割的相關(guān)資料,是基于jDK1.8版本中的String.split()方法,需要的朋友可以參考下
    2022-09-09

最新評(píng)論

老河口市| 金川县| 正阳县| 洛南县| 铅山县| 沭阳县| 禹城市| 建昌县| 凤山县| 辽阳县| 抚远县| 浦东新区| 航空| 常宁市| 积石山| 井冈山市| 施甸县| 土默特左旗| 磴口县| 洛阳市| 汶川县| 涞源县| 乌拉特中旗| 北流市| 青铜峡市| 连城县| 建瓯市| 新邵县| 南阳市| 格尔木市| 科尔| 正安县| 阿拉尔市| 方正县| 台北县| 南开区| 罗平县| 黄石市| 延寿县| 石屏县| 乐业县|