线程池(关于变量捕获、线程数、针对ThreadPoolExecutor的构造方法参数的解释、自实现线程池)

news2024/12/29 9:38:14

目录:

一、前言

二、关于变量捕获

三、针对ThreadPoolExecutor的构造方法参数的解释

四、自实现线程池


一、前言

相比较于进程,创建线程 / 销毁线程 的开销是相对较小的,但是太过频繁的创建线程 / 销毁线程,其开销也很大。这时候我们就需要使用线程池来减少每次启动和销毁线程的损耗。事先把需要使用的线程先创建好,然后放到线程池中,后面需要使用的时候,直接从池里面获取,如果用完了就还给池。

二、关于变量捕获

 public static void main(String[] args) {
        ExecutorService pool = Executors.newFixedThreadPool(10);
        for (int i = 0; i < 1000; i++) {
            int n = i;
            pool.submit(new Runnable() {
                @Override
                public void run() {
                    //注意这里使用的是n,而不是i
                    System.out.println("hello " + n);
                }
            });
        }
    }

这里for循环里面的变量 i 是主线程里的局部变量 (在主线程的栈上),随着主线程这里的代码块执行结束就销毁了,很可能主线程这里for执行完了,当前run的任务在线程池里还没排到,此时i就已经要销毁了。这里就是一个变量捕获,很明显,此处的run方法属于Runnable。这个方法的执行时机,不是立刻马上而是在未来的某个节点(后续在线程池的队列中,排到他了,就让对应的线程去执行)。为了避免作用域的差异,导致后续执行run的时候i已经销毁,于是就有了变量捕获,也就是让run方法把刚才主线程的i给往当前run的栈上拷贝一份。

三、针对ThreadPoolExecutor的构造方法参数的解释

API文档:https://docs.oracle.com/javase/8/docs/api/

  1. corePoolSize 核心线程数

  1. maximumPoolSize 最大线程数

ThreadPoolExecutor相当于把里面的线程分成两类:一类是正式员工(核心线程),一类是临时工(除核心线程外的线程),这两者之和就是最大线程数,核心线程理论上是可以摸鱼的,但是临时工不可以摸鱼,临时工摸鱼有时间限制,一旦超过了keepAliveTime规定的摸鱼时间,那么就会被销毁。

  1. keepAliveTime,unit 除核心线程外的线程数可以休息的时间(临时工可以摸鱼的最大时间)

  1. BlockingQueue<Runnable> workQueue 线程池的任务队列

  1. ThreadFactory threadFactory 线程工厂,用于创建线程

  1. RejectedExecutionHandler handler 描述了线程池的拒绝策略

拒绝策略1:ThreadPoolExecutor.AbortPolicy(如果任务队列满了,就直接抛出异常)

拒绝策略2:ThreadPoolExecutor.CallerRunsPolicy(如果队列满了,多出来的任务,是哪个线程加的,就由谁负责)

拒绝策略3:ThreadPoolExecutor.DiscardOldestPolicy(如果队列满了,就抛弃最早的任务,接受最新的任务)

拒绝策略4:ThreadPoolExecutor.DiscardPolicy(如果队列满了,就抛弃最新的任务)

四、自实现线程池

class MyThreadPoll{
    private BlockingQueue<Runnable> queue = new LinkedBlockingDeque<>();

    public MyThreadPoll(int n){
        //创建线程
        for (int i = 0; i < n; i++) {
            Thread t = new Thread(()->{
                while (true){
                    try {
                        Runnable runnable = queue.take();
                        runnable.run();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            t.start();
        }
    }

    //注册任务给线程池
    public void submit(Runnable runnable){
        try {
            queue.put(runnable);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
public class ThreadDemo26 {
    public static void main(String[] args) {
        MyThreadPoll poll = new MyThreadPoll(10);
        for (int i = 0; i < 1000; i++) {
            int n = i;
            poll.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println("hello"+n);
                }
            });
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/163976.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C 语言编译链接

前言 一个 C 程序究竟是怎么变成可执行程序的&#xff0c;这其间发生了什么&#xff1f;本文将带你简要了解 C 程序编译过程&#xff0c;文章为 《程序员的自我修养—链接、装载与库》的读书笔记&#xff0c;更为详细的过程可以阅读原书。 比如下面一个经典的 C 程序&#xf…

百度飞浆在pycharm中的使用(含官网安装和cuda)

uieGitHub 安装cuda 1 获取版本 我的是 CUDA Toolkit 11.7.1 (August 2022), Versioned Online Documentation 为了防止后期版本不对应&#xff0c;我这里小心谨慎安装了August对应的月份。 C:\Users\89735>nvidia-smi Mon Dec 19 21:31:28 2022 ------------------------…

一眼万年,这3款顶级神软,内存满了也绝不卸载

免费软件都不好用&#xff1f;不&#xff01;下面3款良心软件&#xff0c;颠覆你的认知&#xff0c;功能强大到离谱&#xff0c;值得收藏往后有需要直接使用。 1、桌面运维助手 这是一款堪称神器的国产电脑优化工具&#xff0c;集硬件管理、系统管理、辅助工具于一体&#xff0…

Effective C++条款39:明智而审慎地使用private继承(Use private inheritance judiciously)

Effective C条款39&#xff1a;明智而审慎地使用private继承&#xff08;Use private inheritance judiciously&#xff09;条款39&#xff1a;明智而审慎地使用private继承1、private 继承2、在private继承和复合之间做出正确选择3、使用private继承比组合更加合理的例子4、牢…

wsl安装CUDA

NVCC 昨天已经安装好了gpu版的pytorch&#xff0c;对于一般的代码应该就可以运行了。但有些代码中需要用到cuda算子&#xff0c;需要配置nvcc环境。对于这个我也没能搞太清楚&#xff0c;网上的说法不一&#xff0c;我使用conda安装pytorch时也安装了cudatoolkit&#xff0c;按…

c++11 标准模板(STL)(std::forward_list)(八)

定义于头文件 <forward_list> template< class T, class Allocator std::allocator<T> > class forward_list;(1)(C11 起)namespace pmr { template <class T> using forward_list std::forward_list<T, std::pmr::polymorphic_…

当面试官问:“你还有什么要问我”,怎样回答才最加分?

面试到最后&#xff0c;面试官常常会问求职者&#xff1a;“你还有什么要问我&#xff1f;”许多人面对这个问题&#xff0c;不知该怎样回答&#xff0c;怕回答不好影响自己的面试结果&#xff0c;那么怎么回答才最加分呢&#xff1f;有人说&#xff0c;可以问问这个职位应该具…

springboot整合gateway网关

2.3 搭建Gateway 本项目使用Spring Cloud Gateway作为网关&#xff0c;下边创建网关工程。 新建一个网关工程。 工程结构 添加依赖&#xff1a; XML org.springframework.cloud spring-cloud-starter-gateway com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discove…

TryHackMe-Blog

Blog 比利乔尔&#xff08;Billy Joel&#xff09;在他的家用电脑上写了一个博客&#xff0c;并开始工作。这将是非常棒的&#xff01; 枚举此框并找到隐藏在其上的 2 个标志&#xff01;比利的笔记本电脑上有一些奇怪的事情。你能四处走动并得到你需要的东西吗&#xff1f;还…

蓝队常用的攻击手段

目录 一&#xff0c; 漏洞利用 1.1 SQL 注入漏洞 1.2 跨站漏洞 1.3 文件上传或下载漏洞 1.4 命令执行漏洞 1.5 敏感信息泄露漏洞 在实战过程中&#xff0c;蓝队专家根据实战攻防演练的任务特点逐渐总结出一套成熟的做法:外网纵向突破重点寻找薄弱点&#xff0c;围绕薄弱点…

2022 VeLO: Training Versatile Learned Optimizers by Scaling Up

VeLO: Training Versatile Learned Optimizers by Scaling Up 通过扩展模型的规模来训练一个通用的优化器。 设计上&#xff0c;优化器的原理基于元学习的思路&#xff0c;即从相关任务上学习经验&#xff0c;来帮助学习目标任务。 相比迁移学习&#xff0c;元学习更强调获取元…

2023年批量下载和改名音频专辑(单页列表)

一、下载原理 1&#xff09;找到目标音频的专辑网页&#xff0c;这里以 kite runner mp3为例。&#xff08;需要自己找&#xff09; https://www.xi___ma___la_____ya.com/album/71718770 2&#xff09;进入详细页&#xff08;称为一次请求URL&#xff09;&#xff08;不需要…

JUC(java.util.concurrent)的常见类

文章目录一、JUC常见类Callable 接口ReentrantLockSemaphore(信号量)CountDownLatch一、JUC常见类 concurrent代表了并发&#xff0c;这个包下为我们提供了并发编程(多线程)相关的组件. Callable 接口 我们的Callable接口和Runnable是一样的&#xff0c;但也有一些区别: Run…

C/C++实现跨年表白烟花

跨年表白烟花使用c/c实现烟花效果&#xff08;小白进&#xff09;分析诉求&#xff0c;拆分问题头文件贯穿全文的媒体部分文字部分&#xff1a;进入烟花弹部分烟花弹的属性初始化烟花弹让烟花弹飞起来烟花爆炸烟花弹的属性初始化烟花让烟花炸起来完成代码&#xff1a;使用c/c实…

840个最优的机器学习python开源项目整理分享

本资源包含了840个很棒的机器学习开源项目&#xff0c;总共270万颗星分为32个类别。所有项目均按项目质量得分排名&#xff0c;该得分是根据从GitHub和不同程序包管理器自动收集的各种指标计算得出的。资源整理自网络&#xff0c;资源获取见源地址&#xff1a;https://github.c…

三星手机提取微信聊天数据

三星手机提取微信聊天数据的方法&#xff0c;无需root。 注意&#xff0c;暴力破解密码需要英伟达显卡&#xff0c;一小时内破解&#xff0c;无显卡可能要两天。 1. 安装USB驱动&#xff0c;通过S换机助手&#xff0c;备份微信软件至电脑。注意&#xff0c;选择不加密。 三星…

[硬核] Bootstrap Blazor Table 综合演示例子

知识点: 1.导入导出 2.分页功能 3.增删改查 4.批量删除 5.批量编辑(审核) 6.列排序与列搜索 7.顶部搜索实现所有列搜索 8.高级搜索实现多条件搜索 9.顶部与刷新与视图列 10.实现文本类型明细行 11.列的统计 12.隐藏列,时间日期列格式化 13.新窗口打开 14.随机数据 15.自由编辑…

DVWA靶机CSRF全难度(未完)

目录 Low难度 medium难度 Cross Site Request Forgery跨站的请求伪造 原理&#xff1a;利用受害者尚未失效的身份认证信息、会话&#xff1b;诱骗其访问黑客设计号的页面&#xff0c;在受害人不知情的情况下以受害人的身份向服务器发送请求完成非法操作 Low难度 源代码 &l…

十二、RabbitMQ 报错汇总

&#x1f33b;&#x1f33b; 目录一、报版本过低问题一、报版本过低问题 问题&#xff1a; error: Failed dependencies: libcrypto.so.1.1()(64bit) is needed by erlang-25.1.2-1.el8.x86_64 libcrypto.so.1.1(OPENSSL_1_1_0)(64bit) is needed by erlang-25.1.2-1.el8.x86_…

基于模糊控制的自平衡小车的研究

1、内容简介略635-可以交流、咨询、答疑2、内容说明随着人类文明的发展&#xff0c;传感器技术、计算机应用技术、机械学、微电子技术、通讯技术以及人工智能技术也得到了飞速的发展。进入21世纪后&#xff0c;在机器人学和机器人技术领域&#xff0c;自平衡小车已成为其中的重…