欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解讀線程池-Executors的newSingleThreadExecutor和newFixedThreadPool(1)區(qū)別

 更新時間:2024年08月06日 14:46:35   作者:Ahuuua  
這篇文章主要介紹了解讀線程池-Executors的newSingleThreadExecutor和newFixedThreadPool(1)區(qū)別,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

線程池Executors的newSingleThreadExecutor和newFixedThreadPool(1)

與其他等效的newFixedThreadPool(1)不同

  • newSingleThreadExecutor返回的執(zhí)行器保證不可重新配置。

與其他等效的newScheduledThreadPool(1)不同

  • newSingleThreadScheduledExecutor返回的執(zhí)行器保證不可重新配置以使用其他線程。

newFixedThreadPool(1)的返回結果我們可以通過強轉變成ThreadPoolExecutor,但是這個類是可以自行指定線程數(shù)的。

我們可以通過setCorePoolSize方法來修改。

這樣也就是說,這兩個方法的最大的區(qū)別是第一個方法可以修改線程的數(shù)量,如果用來指定線程數(shù)量為1是不安全的。

newSingleThreadExecutor方法則通過提供了一個包裝類完全堵住了這個漏洞。

舉個例子

拿newSingleThreadExecutor和newFixedThreadPool(1)舉例

import org.junit.Test;
 
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
 
public class ThreadPoolDemo {
    static class MyRunnable implements Runnable {
        @Override
        public void run() {
            System.out.println("開始");
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("結束" + Thread.currentThread().getName());
        }
    }
 
    @Test
    public void test() throws InterruptedException {
        //創(chuàng)建Runnable實例對象
        MyRunnable r = new MyRunnable();
 
        //創(chuàng)建線程池對象
        System.out.println("fixedThreadPool");
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(1);//包含1個線程對象
        for (int i = 0; i < 10; i++) {
            fixedThreadPool.submit(r);
        }
        Thread.sleep(10000);
        /**
         * 以上輸出:
         * fixedThreadPool
         * 開始
         * 結束pool-1-thread-1
         * 開始
         * 結束pool-1-thread-1
         * 開始
         * 結束pool-1-thread-1
         * 開始
         * 結束pool-1-thread-1
         * 開始
         * 結束pool-1-thread-1
         * 開始
         * 結束pool-1-thread-1
         * 開始
         * 結束pool-1-thread-1
         * 開始
         * 結束pool-1-thread-1
         * 開始
         * 結束pool-1-thread-1
         * 開始
         * 結束pool-1-thread-1
         */
 
        System.out.println("singleThreadExecutor");
        ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 10; i++) {
            singleThreadExecutor.submit(r);
        }
        Thread.sleep(10000);
        /**
         * 以上輸出:
         * singleThreadExecutor
         * 開始
         * 結束pool-2-thread-1
         * 開始
         * 結束pool-2-thread-1
         * 開始
         * 結束pool-2-thread-1
         * 開始
         * 結束pool-2-thread-1
         * 開始
         * 結束pool-2-thread-1
         * 開始
         * 結束pool-2-thread-1
         * 開始
         * 結束pool-2-thread-1
         * 開始
         * 結束pool-2-thread-1
         * 開始
         * 結束pool-2-thread-1
         * 開始
         * 結束pool-2-thread-1
         */
 
        System.out.println("fixedThreadPool(5)");
        ((ThreadPoolExecutor) fixedThreadPool).setCorePoolSize(5);
        for (int i = 0; i < 10; i++) {
            fixedThreadPool.submit(r);
        }
        Thread.sleep(10000);
        /**
         * 以上輸出:
         * fixedThreadPool(5)
         * 開始
         * 開始
         * 開始
         * 開始
         * 開始
         * 結束pool-1-thread-1
         * 結束pool-1-thread-5
         * 結束pool-1-thread-2
         * 結束pool-1-thread-3
         * 結束pool-1-thread-4
         * 開始
         * 結束pool-1-thread-4
         * 開始
         * 結束pool-1-thread-4
         * 開始
         * 結束pool-1-thread-4
         * 開始
         * 結束pool-1-thread-4
         * 開始
         * 結束pool-1-thread-4
         * singleThreadExecutor(5)
         */
 
        System.out.println("singleThreadExecutor(5)");
        ((ThreadPoolExecutor) singleThreadExecutor).setCorePoolSize(5);
        for (int i = 0; i < 10; i++) {
            singleThreadExecutor.submit(r);
        }
        /**
         * 以下輸出:
         * Exception in thread "main" java.lang.ClassCastException: java.util.concurrent.Executors$FinalizableDelegatedExecutorService cannot be cast to java.util.concurrent.ThreadPoolExecutor
         * 	at ThreadPoolDemo.main(ThreadPoolDemo.java:33)
         */
    }
}
 

總結

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

相關文章

  • @Scheduled 如何讀取動態(tài)配置文件

    @Scheduled 如何讀取動態(tài)配置文件

    這篇文章主要介紹了@Scheduled 如何讀取動態(tài)配置文件的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Spring Boot集成Spring Cache過程詳解

    Spring Boot集成Spring Cache過程詳解

    這篇文章主要介紹了Spring Boot集成Spring Cache過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • Nacos客戶端本地緩存和故障轉移方式

    Nacos客戶端本地緩存和故障轉移方式

    Nacos客戶端在從Server獲得服務時,若出現(xiàn)故障,會通過ServiceInfoHolder和FailoverReactor進行故障轉移,ServiceInfoHolder緩存服務信息,FailoverReactor處理故障轉移,包括開啟故障轉移開關、讀取備份文件等
    2024-12-12
  • 將Bean注入Spring容器中的常用方式分享

    將Bean注入Spring容器中的常用方式分享

    在Spring框架中,有多種方式可以將Bean(即對象)放入Spring容器中,這篇文章就給大家介紹一些常用的方式,文中有詳細的代碼示例,感興趣的同學可以參考閱讀下
    2023-06-06
  • Java動態(tài)字節(jié)碼注入技術的實現(xiàn)

    Java動態(tài)字節(jié)碼注入技術的實現(xiàn)

    Java動態(tài)字節(jié)碼注入技術是一種在運行時修改Java字節(jié)碼的技術,本文主要介紹了Java動態(tài)字節(jié)碼注入技術的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • 基于StringUtils工具類的常用方法介紹(必看篇)

    基于StringUtils工具類的常用方法介紹(必看篇)

    下面小編就為大家?guī)硪黄赟tringUtils工具類的常用方法介紹(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • mybatisPlus批量插入優(yōu)化加快性能

    mybatisPlus批量插入優(yōu)化加快性能

    這篇文章主要介紹了mybatisPlus批量插入優(yōu)化加快性能,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-12-12
  • Java基于中介者模式實現(xiàn)多人聊天室功能示例

    Java基于中介者模式實現(xiàn)多人聊天室功能示例

    這篇文章主要介紹了Java基于中介者模式實現(xiàn)多人聊天室功能,詳細分析了中介者模式的概念、原理以及使用中介模式實現(xiàn)多人聊天的步驟、操作技巧與注意事項,需要的朋友可以參考下
    2018-05-05
  • idea中斷點類型之All和Thread的區(qū)別介紹

    idea中斷點類型之All和Thread的區(qū)別介紹

    使用all模式對于程序中含有多個線程來說,會將多個線程都阻塞在斷點,此時所有的線程都執(zhí)行到此處,在最后一個線程執(zhí)行到此處是會發(fā)生暫停,在這之前的線程會繼續(xù)執(zhí)行到任意位置,本文給大家詳細介紹下idea中斷點類型之All和Thread的區(qū)別,感興趣的朋友一起看看吧
    2022-03-03
  • Java動態(tài)代理的示例詳解

    Java動態(tài)代理的示例詳解

    動態(tài)代理指的是,代理類和目標類的關系在程序運行的時候確定的,客戶通過代理類來調用目標對象的方法,是在程序運行時根據(jù)需要動態(tài)的創(chuàng)建目標類的代理對象。本文將通過案例詳細講解一下動態(tài)代理,需要的可以參考一下
    2022-02-02

最新評論