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

詳解如何自定義parallelStream線程池

 更新時(shí)間:2023年07月10日 08:36:03   作者:codecraft  
這篇文章主要為大家介紹了如何自定義parallelStream的線程池實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

ForkJoinPool

本文主要研究一下parallelStream怎么使用自定義的線程池

java/util/concurrent/ForkJoinPool.java

public class ForkJoinPool extends AbstractExecutorService {
    public ForkJoinPool(int parallelism,
                        ForkJoinWorkerThreadFactory factory,
                        UncaughtExceptionHandler handler,
                        boolean asyncMode) {
        this(checkParallelism(parallelism),
             checkFactory(factory),
             handler,
             asyncMode ? FIFO_QUEUE : LIFO_QUEUE,
             "ForkJoinPool-" + nextPoolId() + "-worker-");
        checkPermission();
    }
    private ForkJoinPool(int parallelism,
                         ForkJoinWorkerThreadFactory factory,
                         UncaughtExceptionHandler handler,
                         int mode,
                         String workerNamePrefix) {
        this.workerNamePrefix = workerNamePrefix;
        this.factory = factory;
        this.ueh = handler;
        this.config = (parallelism & SMASK) | mode;
        long np = (long)(-parallelism); // offset ctl counts
        this.ctl = ((np << AC_SHIFT) & AC_MASK) | ((np << TC_SHIFT) & TC_MASK);
    }
    private static ForkJoinPool makeCommonPool() {
        int parallelism = -1;
        ForkJoinWorkerThreadFactory factory = null;
        UncaughtExceptionHandler handler = null;
        try {  // ignore exceptions in accessing/parsing properties
            String pp = System.getProperty
                ("java.util.concurrent.ForkJoinPool.common.parallelism");
            String fp = System.getProperty
                ("java.util.concurrent.ForkJoinPool.common.threadFactory");
            String hp = System.getProperty
                ("java.util.concurrent.ForkJoinPool.common.exceptionHandler");
            if (pp != null)
                parallelism = Integer.parseInt(pp);
            if (fp != null)
                factory = ((ForkJoinWorkerThreadFactory)ClassLoader.
                           getSystemClassLoader().loadClass(fp).newInstance());
            if (hp != null)
                handler = ((UncaughtExceptionHandler)ClassLoader.
                           getSystemClassLoader().loadClass(hp).newInstance());
        } catch (Exception ignore) {
        }
        if (factory == null) {
            if (System.getSecurityManager() == null)
                factory = new DefaultCommonPoolForkJoinWorkerThreadFactory();
            else // use security-managed default
                factory = new InnocuousForkJoinWorkerThreadFactory();
        }
        if (parallelism < 0 && // default 1 less than #cores
            (parallelism = Runtime.getRuntime().availableProcessors() - 1) <= 0)
            parallelism = 1;
        if (parallelism > MAX_CAP)
            parallelism = MAX_CAP;
        return new ForkJoinPool(parallelism, factory, handler, LIFO_QUEUE,
                                "ForkJoinPool.commonPool-worker-");
    }
}

 parallelStream默認(rèn)使用的是common的ForkJoinPool,可以通過系統(tǒng)屬性來設(shè)置parallelism等

ForkJoinPoolFactoryBean

org/springframework/scheduling/concurrent/ForkJoinPoolFactoryBean.java

public class ForkJoinPoolFactoryBean implements FactoryBean<ForkJoinPool>, InitializingBean, DisposableBean {
    private boolean commonPool = false;
    private int parallelism = Runtime.getRuntime().availableProcessors();
    private ForkJoinPool.ForkJoinWorkerThreadFactory threadFactory = ForkJoinPool.defaultForkJoinWorkerThreadFactory;
    @Nullable
    private Thread.UncaughtExceptionHandler uncaughtExceptionHandler;
    private boolean asyncMode = false;
    private int awaitTerminationSeconds = 0;
    @Nullable
    private ForkJoinPool forkJoinPool;
    //......
    @Override
    public void destroy() {
        if (this.forkJoinPool != null) {
            // Ignored for the common pool.
            this.forkJoinPool.shutdown();
            // Wait for all tasks to terminate - works for the common pool as well.
            if (this.awaitTerminationSeconds > 0) {
                try {
                    this.forkJoinPool.awaitTermination(this.awaitTerminationSeconds, TimeUnit.SECONDS);
                }
                catch (InterruptedException ex) {
                    Thread.currentThread().interrupt();
                }
            }
        }
    }
}

 spring3.1提供了ForkJoinPoolFactoryBean,可以用于創(chuàng)建并托管forkJoinPool

示例

配置

@Configuration
public class ForkJoinConfig {
    @Bean
    public ForkJoinPoolFactoryBean forkJoinPoolFactoryBean() {
        ForkJoinPoolFactoryBean factoryBean = new ForkJoinPoolFactoryBean();
        factoryBean.setCommonPool(false);
        // NOTE LIFO_QUEUE FOR working steal from tail of queue
        factoryBean.setAsyncMode(true); // NOTE true FIFO_QUEUE, false LIFO_QUEUE
        factoryBean.setParallelism(10);
        // factoryBean.setUncaughtExceptionHandler();
        factoryBean.setAwaitTerminationSeconds(60);
        return factoryBean;
    }
}

使用

@Autowired
    ForkJoinPoolFactoryBean forkJoinPoolFactoryBean;
    public void streamParallel() throws ExecutionException, InterruptedException {
        List<TodoTask> result = forkJoinPoolFactoryBean.getObject().submit(new Callable<List<TodoTask>>() {
            @Override
            public List<TodoTask> call() throws Exception {
                return IntStream.rangeClosed(1, 20).parallel().mapToObj(i -> {
                    log.info("thread:{}", Thread.currentThread().getName());
                    return new TodoTask(i, "name"+i);
                }).collect(Collectors.toList());
            }
        }).get();
        result.stream().forEach(System.out::println);
    }

 common的workerName前綴為ForkJoinPool.commonPool-worker-
自定義的workerName前綴默認(rèn)為ForkJoinPool- nextPoolId() -worker-

小結(jié)

parallelStream默認(rèn)使用的是commonPool,是static代碼塊默認(rèn)初始化,針對(duì)個(gè)別場(chǎng)景可以自定義ForkJoinPool,將parallelStream作為一個(gè)任務(wù)丟進(jìn)去,這樣子就不會(huì)影響默認(rèn)的commonPool。

以上就是如何自定義parallelStream的線程池的詳細(xì)內(nèi)容,更多關(guān)于如何自定義parallelStream的線程池的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • springboot 配置文件里部分配置未生效的解決

    springboot 配置文件里部分配置未生效的解決

    springboot 配置文件里部分配置未生效的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • SpringBoot實(shí)現(xiàn)License生成和校驗(yàn)的過程詳解

    SpringBoot實(shí)現(xiàn)License生成和校驗(yàn)的過程詳解

    在我們向客戶銷售商業(yè)軟件的時(shí)候,常常需要對(duì)所發(fā)布的軟件實(shí)行一系列管控措施,諸如驗(yàn)證使用者身份、軟件是否到期,以及保存版權(quán)信息和開發(fā)商詳情等,所以本文給大家介紹了SpringBoot實(shí)現(xiàn)License生成和校驗(yàn)的過程,需要的朋友可以參考下
    2024-09-09
  • Java數(shù)據(jù)結(jié)構(gòu)之HashMap和HashSet

    Java數(shù)據(jù)結(jié)構(gòu)之HashMap和HashSet

    這篇文章主要介紹了HashMap和HashSet,什么是哈希表以及HashMap的部分源碼解讀,想了解更多的小伙伴,可以參考閱讀本文
    2023-03-03
  • Java編程中的性能優(yōu)化如何實(shí)現(xiàn)

    Java編程中的性能優(yōu)化如何實(shí)現(xiàn)

    這篇文章主要介紹了Java編程中的性能優(yōu)化如何實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • mybatis框架order by作為參數(shù)傳入時(shí)失效的解決

    mybatis框架order by作為參數(shù)傳入時(shí)失效的解決

    這篇文章主要介紹了mybatis框架order by作為參數(shù)傳入時(shí)失效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • SpringBoot實(shí)現(xiàn)短鏈接系統(tǒng)的使用示例

    SpringBoot實(shí)現(xiàn)短鏈接系統(tǒng)的使用示例

    由于短鏈接可能涉及到用戶隱私和安全問題,所以短鏈接系統(tǒng)也需要符合相關(guān)的數(shù)據(jù)保護(hù)和安全標(biāo)準(zhǔn),本文主要介紹了SpringBoot實(shí)現(xiàn)短鏈接系統(tǒng)的使用示例,感興趣的可以了解一下
    2023-09-09
  • Springboot項(xiàng)目接口限流實(shí)現(xiàn)方案

    Springboot項(xiàng)目接口限流實(shí)現(xiàn)方案

    這篇文章主要介紹了Springboot項(xiàng)目接口限流實(shí)現(xiàn)方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 詳解Java如何使用Jsoup修改HTML元素的屬性

    詳解Java如何使用Jsoup修改HTML元素的屬性

    Jsoup?是一個(gè)強(qiáng)大的?Java?庫,用于解析和操作?HTML?文檔,本文主要為大家介紹了如何使用Jsoup進(jìn)行修改HTML元素的屬性,感興趣的可以了解下
    2025-01-01
  • springboot druid數(shù)據(jù)庫連接池連接失敗后一直重連的解決方法

    springboot druid數(shù)據(jù)庫連接池連接失敗后一直重連的解決方法

    本文主要介紹了springboot druid數(shù)據(jù)庫連接池連接失敗后一直重連的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • SpringMVC文件上傳請(qǐng)求問題分析

    SpringMVC文件上傳請(qǐng)求問題分析

    這篇文章主要介紹了SpringMVC文件上傳請(qǐng)求,我們發(fā)的請(qǐng)求默認(rèn)都是由DispatcherServlet類的doDispatch()來處理,這個(gè)方法的邏輯處理的第一步就是處理文件上傳的請(qǐng)求,我們一起來看看是怎么處理的吧
    2024-07-07

最新評(píng)論

阿拉善盟| 鸡东县| 元朗区| 巫溪县| 申扎县| 子长县| 松江区| 长泰县| 赫章县| 建水县| 平安县| 彝良县| 葵青区| 香港| 红安县| 寿宁县| 杭锦旗| 基隆市| 南江县| 宝丰县| 全南县| 阿尔山市| 镶黄旗| 镇安县| 洛隆县| 定远县| 三江| 咸丰县| 邯郸县| 南丹县| 永安市| 大埔区| 樟树市| 广元市| 安达市| 惠东县| 平阳县| 雷波县| 昭苏县| 铜山县| 芦溪县|