当前位置: 首页 > news >正文

线程池——Java

一、前言

        在字符串常量池中,字符串常量在java程序运行之前就已经创建好了,等程序运行起来后,就可以直接从常量池中拿到字符串并加载到内存中,这样的设计就省下了字符串的构造与销毁的内存开销。

二、优势

        操作系统由内核与应用程序构成,当一段代码是在应用程序中运行的,那么整个执行过程就是可控的,更加高效;当一段代码在内核中运行时,java程序员就无法监视到程序的执行情况,就导致代码的执行是不可控的。

        对于线程也是同样的,当我们从线程池获取线程时,在应用程序层面就可以完成,消耗的资源更小,同时也是可控的;当在操作系统中创建线程时,就需要内核的配合完成,整个过程是不可控的,也会消耗过多的资源。

        因此,线程池可以高效的地创建、销毁线程。

三、标准库的线程池

1、ThreadPoolExecutor

使用ThreadPoolExecutor创建线程时,涉及到以下七个参数:

1)核心线程数:int corePoolSize

当线程池创建时,这些线程也会随之创建,直到线程池销毁后这些线程才会销毁;

2)最大线程数:int maximumPoolSize

最大线程数 = 核心线程数 + 非核心线程数

非核心线程就是在程序不繁忙的时候就销毁,繁忙时就创建;

3)非核心线程允许空闲的时间:long keepAliveTime
4)上述时间的时间按类型:TimeUnit unit

有秒,分钟,还是其他类型;

5)工作队列(传递任务的阻塞队列):BolckingQueue<Runnable> workQueue

线程池本质上是生产消费模型,调用submit方法即为生产,线程池中的线程即为消耗;

6)线程工厂:ThreadFactory threadFactory

使用工厂模式创建的线程,这里会对线程进行初始化操作;

7)拒绝策略:RejectedExecutionHandler handler

使用submit将任务添加到阻塞队列时,当队列满后就会产生阻塞,但是对于线程池来说不是真的阻塞,而是执行拒绝策略相关的代码,有如下几种拒绝策略:

ThreadPoolExecutor.AbortPolicy(),线程池直接抛出异常;

ThreadPoolExecutor.CallerRunsPolicy(),让调用submit的线程执行任务;

ThreadPoolExecutor.DiscardOldestPolicy(),丢弃最老的任务;

ThreadPoolExecutor.DiscardPolicy(),丢弃最新的任务,即submit的任务

2.Executors

        是线程池的工厂类,使用该类创建线程池,返回的是ExecutorService类型的线程池,有以下几种创建线程池的方式:

1)newFixedThreadPool

创建固定线程数目(核心线程数)的线程池

ExecutorService executorService = Executors.newFixedThreadPool(10);
2)newCachedThreadPool

创建线程数目动态增长的线程池:

ExecutorService executorService = Executors.newCachedThreadPool();

也可以将线程工厂作为参数传入到newCachedThreadPool中;

3)newSingleThreadExecutor

创建单个线程的线程池

ExecutorService executorService = Executors.newSingleThreadExecutor();

四、注意事项

线程池中的线程是前台线程,会阻止线程结束,有如下几种解决方案:

1)setDaemon(true)

将线程设置为后台线程;

2)shutdown()

将线程池中的线程全部关闭,但不能保证所有的任务都执行完;

3)awaitTermination()

确认所有任务都执行完后才关闭线程。

http://www.lryc.cn/news/468821.html

相关文章:

  • java 17天 TreeSet以及Collections
  • JavaScript 第27章:构建工具与自动化
  • Android原生ROM出现WIFI显示网络连接受限,网络无法连接的问题
  • 如何实现网页上的闪烁效果
  • 事件总线—Event Bus 使用及讲解
  • 信息安全工程师(67)网络流量清洗技术与应用
  • 【项目】论坛系统测试
  • XJ02、消费金融|消费金融业务模式中的主要主体
  • 基于神经网络的农业病虫害损失预测
  • 【DSP】TI 微控制器和处理器的IDE安装CCSTUDIO
  • Web应用框架-Django应用基础
  • qt QMainWindow详解
  • 第二单元历年真题整理
  • Ubuntu下载protobuf
  • 【算法优化】混合策略改进的蝴蝶优化算法
  • 什么是标准差?详解
  • C++20中头文件syncstream的使用
  • 判断特定时间点开仓的函数(编程技巧)
  • 如何新建一个React Native的项目
  • 学习--图像信噪比
  • 【2024CANN训练营第二季】使用华为云体验AscendC_Sample仓算子运行
  • 使用 NumPy 和 Matplotlib 实现交互式数据可视化
  • TCP 攻击为何在 DDoS 攻击中如此常见
  • 未来汽车驾驶还会有趣吗?车辆动力学系统简史
  • LCD手机屏幕高精度贴合
  • 15_卸载操作
  • ONLYOFFICE 文档8.2版本已发布:PDF 协作编辑、改进界面、性能优化等更新
  • redis的string是怎么实现的
  • 基于STM32设计的智能婴儿床(华为云IOT)(244)
  • html+css+js实现Notification 通知