创建线程池的方法_java引用就是对象本身

创建线程池的方法_java引用就是对象本身创建线程池的方法一、创建线程池的三种方法Executors.newSingleThreadExecutor();//单个线程Executors.newFixedThreadPool(5);//创建一个固定的线程池Executors.newCachedThreadPool();//创建一个可伸缩的线程池1.newSingleThreadExecutorimportjava.util.concurrent.ExecutorService;importjava.util.concurr

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

创建线程池的方法

一、创建线程池的三种方法

Executors.newSingleThreadExecutor(); //单个线程
Executors.newFixedThreadPool(5); //创建一个固定的线程池
Executors.newCachedThreadPool(); //创建一个可伸缩的线程池

1.newSingleThreadExecutor

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ExecuterTest1 { 
   
    public static void main(String[] args) { 
   
        ExecutorService threadPool = Executors.newSingleThreadExecutor();  //单个线程
        try { 
   
            for(int i=0;i<10;i++) { 
   
                threadPool.execute(()->{ 
   
                    System.out.println(Thread.currentThread().getName()+" ok");
                });
            }
        }catch (Exception e) { 
   
            e.printStackTrace();
        }finally { 
   
            //关闭线程池
            threadPool.shutdown();
        }

    }
}

2. newFixedThreadPool

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ExecuterTest1 { 
   
    public static void main(String[] args) { 
   
        ExecutorService threadPool = Executors.newFixedThreadPool(5); //创建一个固定的线程池

        try { 
   
            for(int i=0;i<10;i++) { 
   
                threadPool.execute(()->{ 
   
                    System.out.println(Thread.currentThread().getName()+" ok");
                });
            }
        }catch (Exception e) { 
   
            e.printStackTrace();
        }finally { 
   
            //关闭线程池
            threadPool.shutdown();
        }

    }
}

3. newCachedThreadPool

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ExecuterTest1 { 
   
    public static void main(String[] args) { 
   
        ExecutorService threadPool = Executors.newCachedThreadPool();  //创建一个可伸缩的线程池
        try { 
   
            for(int i=0;i<10;i++) { 
   
                threadPool.execute(()->{ 
   
                    System.out.println(Thread.currentThread().getName()+" ok");
                });
            }
        }catch (Exception e) { 
   
            e.printStackTrace();
        }finally { 
   
            //关闭线程池
            threadPool.shutdown();
        }

    }
}

二、三种方法的源码

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

//#############################################################

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

//############################################################

public static ExecutorService newCachedThreadPool() { 
   
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,  //约等于20亿
                                  60L, TimeUnit.SECONDS,
                                  new SynchronousQueue<Runnable>());
}
  • 以上三种方法中都调用ThreadPoolExecutor来创建线程池。
  • 但三种方法都存在一定的弊端:
  • (1)SingleThreadExecutor和FixedThreadPool允许的请求队列长度为Integer.MAX.VALUE,可能会导致OOM
  • (2)CachedThreadPool允许的创建线程数量为Integer.MAX.VALUE,可能会导致OOM

ThreadPoolExecutor源码分析

    public ThreadPoolExecutor(int corePoolSize,     //核心线程池大小
                              int maximumPoolSize,  //最大核心线程池大小
                              long keepAliveTime,   //超时了没有人调用就会释放
                              TimeUnit unit,   //超时单位
                              BlockingQueue<Runnable> workQueue,   //阻塞队列
                              ThreadFactory threadFactory,        //线程工厂,创建线程的,一般不用动
                              RejectedExecutionHandler handler) { 
      //拒绝策略
        if (corePoolSize < 0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize < corePoolSize ||
            keepAliveTime < 0)
            throw new IllegalArgumentException();
        if (workQueue == null || threadFactory == null || handler == null)
            throw new NullPointerException();
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
        this.keepAliveTime = unit.toNanos(keepAliveTime);
        this.threadFactory = threadFactory;
        this.handler = handler;
    }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187308.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 判断回文字符串-C语言

    判断回文字符串-C语言C语言实现判断字符串是否是回文描述所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如”level”、“aba”。超级简单上代码#include<stdio.h>#include<string.h>#defineNUM100intmain(){charstr[NUM];intflag=0;scanf(“%s”,str);intlen=strlen(str);for(inti=0;i

    2022年6月6日
    37
  • 发卡网源码(企业和个人发卡网源码二合一)及代理系统附搭建教程

    发卡网源码(企业和个人发卡网源码二合一)及代理系统附搭建教程  最近,有网友问到,自己在上传发卡网源码的时候,总是各种出错。比如404、或者数据库错误等等。  如果通过自己上传源码,安装的时候还是出现各种错误。  附源码及演示:fakaysw.top  那么,我建议可以使用企业级发卡网源码的一键部署功能。  这个功能对于新手来说,非常好用,十分省心。  第一种方式是,找到宝塔面板的“软件商店”-“发卡网源码一键部署”  看一下列表中有没有你想要安装的程序,如果没有找到,看下面的第二种方式  第二种方式,找到“软件商店”,在搜索框搜索“发卡网一键

    2022年7月14日
    303
  • 函数对象的内部方法call(), apply(), bind()

    函数对象的内部方法call(), apply(), bind()

    2021年9月2日
    52
  • 前端vue面试题2021_vue 面试题 2021

    前端vue面试题2021_vue 面试题 2021一.自我介绍(我是谁来自哪里,今天来的目的,面试的岗位是什么,几年的工作经验,掌握的技术栈有哪些,开发过什么项目,项目中负责的板块是什么)面试官您好!我叫XXX,来自XXX,很荣幸能来我们公司面试,我从事前端开发有3年了,目前掌握的技术有html,css,js,ajax,vue,小程序,参与过各种类型的项目。我做过的项目有A,B,C,D,E那么最近做的一个项目是XXX在这个项目中我主要负责的板块是XXX面试官您这边还有什么想要了解的么。二.项目功能提问vue后台项目(这几个功能点要求

    2025年10月5日
    3
  • linux内核移植步骤「建议收藏」

    linux内核移植步骤「建议收藏」2016.6.8经过一个多星期的内核折磨,今天终于可以写下自己移植内核的一些心得,网上有很多博客论坛都有谈到,但是这些又说的方式有些模糊,这里我综合的几个博客在重新说下内核替换编译的步骤、以及如何更新启动项grub。替换linux的内核一共有两种方式,第一种方式是下载官方kernel提供的源码包,进行编译替换;第二种直接下载内核安装包deb,进行升级替换。下面分别从这两种方式进行一个说明:…

    2022年7月23日
    7
  • 桌面cpu性能排行榜_19年cpu天梯图

    桌面cpu性能排行榜_19年cpu天梯图排名 处理器 图例 分数 1 IntelXeonPlatinum8173M@2.00GHz 28860 2 IntelXeonGold6154@3.00GHz 27789 3 IntelCorei9-7980XE@2.60GHz 27736 4 IntelXeonW-…

    2022年9月20日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号