Java线程池中哪些事??

news2024/11/29 1:41:17

需要提前把线程准备好!!创建线程不是直接从系统申请,而是从池子里拿!

等到线程不用了,也是还给池子!!

池子的目的是为了提高效率

线程的创建虽然比进程轻量,但是在频繁创建的情况下,开销也是不可忽略的!!则希望还能进一步提高效率,那么,就需要用到线程池了!!

为啥从池子里拿线程比从系统创建线程更高效??

原因:从线程池那线程,存粹的用户态操作,从系统创建线程,涉及到用户态和内核态之间的切换,真正的创建,是要在内核态完成的~~

纯用户态操作时间是可控的!

涉及到内核态操作,时间就不太可控了!

标准库里提供了现成的线程池~~

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

public class Main {
    public static void main(String[] args) {
        ExecutorService pool= Executors.newFixedThreadPool(10);
        //此处并非直接new ExecutorService 对象,而是通过Executors类,里面的静态方法,完成对象的构造
        //工厂模式:创建对象不在new,而是使用一些其他的方法(通常为静态方法),协助我们把对象创建出来
        //Executors.newFixedThreadPool(10)构造一个固定为10线程的线程池
        //Executors.newFixedThreadPool()不设置固定值,按需创建,用完了不会立即销毁,留着以后接着用!
        pool.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println("hello");
            }
        });
    }
}

需要大家主注意一下笔者的这些备注~

上述的这些工厂方法,其实都是基于一个类:ThreadPoolExecutor的封装(参数很多,还挺抽象的)

总分:多线程代码,还是挺复杂的,稍微不留点神额,就会有问题!

但是,在Java圈子里,多线程仍然是一个比较主流的并发编程模型~

线程池:从线程池取线程,是属于纯用户态操作,不涉及到和内存的交互!!

ThreadPoolExecutor:标准库提供的四种拒绝策略

ThreadPoolExecutor.AbortPolicy:如果满了,继续添加任务,添加操作直接抛出异常

ThreadPoolExecutor.CallerRunsPolicy:添加的线程自己负责执行这个任务

ThreadPoolExecutor.DiscardOldestPolicy:丢弃最老的任务(最先安排的任务)

ThreadPoolExecutor.DiscardPolicy:丢弃最新的任务

接下来,我们来自己实现一个线程池:

import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;

class MyThreadPool {
    //手动实现一个线程池
    //阻塞队列
    private BlockingDeque<Runnable> queue=new LinkedBlockingDeque<>();
    public void submit(Runnable runnable) throws InterruptedException{
        queue.put(runnable);
    }

    //此处实现一个固定线程数的线程池
    public MyThreadPool(int n){//n表示线程数量
        for (int i = 0; i < n; i++) {
            Thread t=new Thread(()->{
                try {
                    while (true){
                        //while可确保不停的取任务
                        Runnable runnable=queue.take();
                        runnable.run();
                    }
                }catch (InterruptedException o){
                    o.printStackTrace();
                }
            });
            //启动线程
            t.start();
        }
    }
}


public class Main1 {
    public static void main(String[] args) throws InterruptedException {
        MyThreadPool pool=new MyThreadPool(10);//创建线程池
        for (int i = 0; i < 100; i++) {
            int number=i;
            //匿名内部类,而lambad本质就是匿名内部类的简化写法!!

            pool.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println("hello + main");
                }
            });
        }
        Thread.sleep(1000);
    }
}

根据代码的运行结果:

可以看到:线程池中任务执行的顺序和添加顺序不一定相同!!非常正常!!原因:创建的这10个线程是无序调度的!

问题1:

在上述的代码中:用到了number=i;直接用不行吗??

每次循环都是创建新的number,没有人修改该number,匿名内部类也是要捕获外界变量,而变量捕获要求得是final,而此处的 i 在跟着for循环在不停的修改,因此,创建一个新的变量,让起每次for循环都变成新的!!

问题2:

当前代码中,搞了个10个线程的线程池,在实际开发中,一个线程池的线程数量设置多少是比较合适的??

肯定线程并不是越多越好!!线程的执行本质上是要在CPU上调度的(资源)!最好的做法是做测试的方式来确定!(运行下程序,计算下时间,同时监测资源使用状态)

到此为止:多线程大致结束!!

多线程初阶,主要介绍了线程的概念,及其多线程编程,多线程编程的注意事项,代码案列,算是最核心的部分了!!

面试常考+工作常用!!

多线程进阶(锦上添花),学有余力可以搞搞!!(能理解最好,不能理解就背)

主要围绕一些更深奥的面试题来展开的!

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

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

相关文章

【计算机网络】图解应用层协议

图解应用层协议 1.应用层2.远程登录2.1 Telnet2.2 SSH 3.文件传输3.1 FTP3.2 TFTP 4.电子邮件4.1 通信架构4.2 邮件地址4.3 SMTP 协议4.4 POP3 协议4.5 IMAP 协议 5.WWW5.1 URI5.2 HTML5.3 HTTP 6.网络管理应用6.1 DHCP 协议6.2 DNS 协议 1.应用层 我们前面介绍过 TCP / IP 模…

【深度学习】 Python 和 NumPy 系列教程(十一):NumPy详解:3、数组数学(元素、数组、矩阵级别的各种运算)

目录 一、前言 二、实验环境 三、NumPy 0、多维数组对象&#xff08;ndarray&#xff09; 多维数组的属性 1、创建数组 2、数组操作 3、数组数学 1. 元素级别 a. 直接运算 b. 加法&#xff1a;np.add()函数 c. 减法&#xff1a;np.subtract()函数 d. 乘法&#xf…

Redis-带你深入学习数据类型zset

目录 1、zset有序集合 2、zset相关命令 2.1、添加或更新指定的元素——zadd 2.2、获取有序集合zset的元素个数相关命令&#xff1a;zcard、zcount 2.3、返回指定区间元素相关命令&#xff1a;zrange、arevrange、zrangebyscore 2.4、删除相关命令&#xff1a;zpopmax、zp…

C# 模拟button按钮批量锁住与打开

项目需求&#xff1a; 当winform界面上存在多个按钮时&#xff08;大于2个&#xff09;&#xff0c;用户需求为当点击其中一个按钮后&#xff0c;其它按钮全部为禁用&#xff0c;当被点击的按钮后台逻辑执行完成后&#xff0c;再释放所有按钮。用户可再次点击其它按钮。 此案…

Eclipse官网下载历史版本

进入官网 https://www.eclipse.org/ 进入下载页面 选择下载包 同一版本&#xff0c;又有不同类型 Eclipse IDE for Enterprise Java and Web Developers Eclipse IDE for Java Developers 任何Java开发人员必备的工具&#xff0c;包括Java IDE、Git客户端、XML编辑器、Mave…

第33章_瑞萨MCU零基础入门系列教程之DHT11温湿度获取实验

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

数据采集:数据挖掘的基础

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

解决gyp verb `which` failed python2 Error: not found: python2

运行老项目遇到如下报错 PS C:\Users\demo02> yarn install yarn install v1.22.19 info No lockfile found. [1/5] Validating package.json... [2/5] Resolving packages... warning axios0.18.1: Critical security vulnerability fixed in v0.21.1. For more informati…

4.1.8- Web 应用程序使用的组件进行指纹识别

Web 应用程序使用的组件进行指纹识别 IDWSTG-INFO-08 总结 毫不夸张地说&#xff0c;几乎所有可以想象的Web应用程序的想法都已经投入开发。随着全球大量自由和开源软件项目的积极开发和部署&#xff0c;应用程序安全测试很可能会遇到完全或部分依赖于这些知名应用程序或框架…

vue cli npm run build打生产环境包报错Cannot read property ‘pop‘ of undefined

问题出在webpack配置的代码拆分splitChunks 解决办法&#xff1a;每个cacheGroups中配置enforce: true;

数据结构——排序算法——快速排序

快速排序算法的基本思想是 1.从数组中取出一个数&#xff0c;称之为基数&#xff08;pivot&#xff09; 2.遍历数组&#xff0c;将比基数大的数字放到它的右边&#xff0c;比基数小的数字放到它的左边。遍历完成后&#xff0c;数组被分成了左右两个区域 3.将左右两个区域视为两…

巧用Lambda表达式获取对象属性名告别魔法值

在我们日常开发中&#xff0c;使用 MyBatis-Plus 写 SQL 执行的时候&#xff0c;难免会用到表字段&#xff0c;虽然 MyBatis-Plus 提供了 LambdaQueryWrapper 帮助我们使用 Lambda 方式调用对象属性名&#xff0c;但有的时候还是不免用到魔法值&#xff0c;当对象的属性名更改了…

检索技术核心学习总结

一、学习检索技术的必要性分析 &#xff08;一&#xff09;关键原因分析 学习检索技术&#xff08;Information Retrieval&#xff0c;IR&#xff09;具有多种重要的原因&#xff0c;特别是在今天信息爆炸的数字化时代。 总的来说&#xff0c;学习检索技术有助于提高信息处理…

基于Python和mysql开发的商城购物管理系统分为前后端(源码+数据库+程序配置说明书+程序使用说明书)

一、项目简介 本项目是一套基于Python和mysql开发的商城购物管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Python学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过…

Elasticsearch:什么是生成式人工智能?

生成式人工智能定义 给学生的解释&#xff08;基本&#xff09;&#xff1a; 生成式人工智能是一种可以创造新的原创内容的技术&#xff0c;例如艺术、音乐、软件代码和写作。 当用户输入提示时&#xff0c;人工智能会根据从互联网上现有示例中学到的知识生成响应&#xff0c;…

记一次线上BUG排查过程

1. 线上遇到一个非常奇怪的bug&#xff0c;为一个用户分配业务线类型后&#xff0c;该用户登录时&#xff0c;提示502&#xff0c;但其它的用户登录完全是正常的 2. 问题现象 3. 排查思路 先去看线上日志&#xff0c;看是否有error&#xff0c;但日志里边这个接口200正常返回…

业务中如何拓展微前端架构

站在整体架构的角度&#xff0c;微前端可以分为以下几类拓展迭代方向。 注册更多微应用 随着业务的扩展,我们可以在主应用中注册更多的微应用。每个微应用是一个独立的子系统,只需要在主应用的注册列表中添加新的项,配置微应用的名称、入口、活动规则等信息即可。 集成微应用…

【element-ui】el-date-picker 之picker-options时间选择区间禁用效果的实现

element-ui 时间选择器的时间区间禁用dom层引入:picker-option <el-date-pickerv-model"searchFormObj.workTime"clearablevalue-formate"yyyy-MM-dd":picker-options"pickerOptions"placeholder"请选择时间" ></el-date-pi…

应用在儿童平板防蓝光中的LED防蓝光灯珠

现在电子产品多&#xff0c;手机、平板电脑、电子书等等&#xff0c;由于蓝光有害眼睛健康&#xff0c;于是市场上有很多防蓝光的眼镜、防蓝光的手机膜、防蓝光的平板&#xff0c;这些材料和设备到底有没有用&#xff1f;如何正确预防蓝光危害呢&#xff1f; 我们现在所用的灯…

借助工业PoE交换机实现智慧停车场管理

停车场是现代城市的重要基础设施&#xff0c;而且随着汽车保有量的持续增长&#xff0c;城市中也出现了数百甚至上千停车位的大型、超大型停车场&#xff0c;而这些大型停车场的管理和服务也是一个难题。 针对大型停车场的管理&#xff0c;可以借助工业PoE交换机&#xff0c;快…