线程池[重点]

线程池概述

线程池就是一个可以复用线程的技术。

不使用线程池的问题 :如果用户每发起一个请求,后台就创建一个新线程来处理,下次新任务来了又要创建新线程,而创建新线程的开销是很大的,这样会严重影响系统的性能。

线程池实现的API、参数说明

JDK 5.0起提供了代表线程池的接口:ExecutorService。

如何得到线程池对象:

方式一:使用ExecutorService的实现类ThreadPoolExecutor自创建一个线程池对象。

方式二:使用Executors(线程池的工具类)调用方法返回不同特点的线程池对象。

ThreadPoolExecutor构造器的参数说明: 

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) 

线程池常见面试题:

临时线程什么时候创建啊?

新任务提交时发现核心线程都在忙,任务队列也满了,并且还可以创建临时线程,此时才会创建临时线程。

什么时候会开始拒绝任务?

核心线程和临时线程都在忙,任务队列也满了,新的任务过来的时候才会开始任务拒绝。 

ThreadPoolExecutor创建线程池对象示例

ExecutorService pools = new ThreadPoolExecutor(3, 5, 8 , TimeUnit.SECONDS, new ArrayBlockingQueue<>(6),Executors.defaultThreadFactory() , new ThreadPoolExecutor.AbortPolicy());

ExecutorService的常用方法

新任务拒绝策略

线程池处理Runnable任务

public class MyRunnable implements Runnable{@Overridepublic void run() {for (int i = 0; i < 5; i++) {System.out.println(Thread.currentThread().getName() + "输出了:HelloWorld ==> "  + i);}try {System.out.println(Thread.currentThread().getName() + "本任务与线程绑定了,线程进入休眠了~~~");Thread.sleep(10000000);} catch (Exception e) {e.printStackTrace();}}
}
public class ThreadPoolDemo1 {public static void main(String[] args) {// 1、创建线程池对象/**public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)*/ExecutorService pool = new ThreadPoolExecutor(3, 5 ,6, TimeUnit.SECONDS, new ArrayBlockingQueue<>(5) , Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy() );// 2、给任务线程池处理。Runnable target = new MyRunnable();pool.execute(target);pool.execute(target);pool.execute(target);pool.execute(target);pool.execute(target);pool.execute(target);pool.execute(target);pool.execute(target);// 创建临时线程pool.execute(target);pool.execute(target);
//        // 不创建,拒绝策略被触发!!!
//        pool.execute(target);// 关闭线程池(开发中一般不会使用)。// pool.shutdownNow(); // 立即关闭,即使任务没有完成,会丢失任务的!pool.shutdown(); // 会等待全部任务执行完毕之后再关闭(建议使用的)}
}

线程池处理Callable任务

/**1、定义一个任务类 实现Callable接口  应该申明线程任务执行完毕后的结果的数据类型*/
public class MyCallable implements Callable<String>{private int n;public MyCallable(int n) {this.n = n;}/**2、重写call方法(任务方法)*/@Overridepublic String call() throws Exception {int sum = 0;for (int i = 1; i <= n ; i++) {sum += i;}return Thread.currentThread().getName()+ "执行 1-" + n+ "的和,结果是:" + sum;}
}
public class ThreadPoolDemo2 {public static void main(String[] args) throws Exception {// 1、创建线程池对象/**public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)*/ExecutorService pool = new ThreadPoolExecutor(3, 5 ,6, TimeUnit.SECONDS, new ArrayBlockingQueue<>(5) , Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy() );// 2、给任务线程池处理。Future<String> f1 = pool.submit(new MyCallable(100));Future<String> f2 = pool.submit(new MyCallable(200));Future<String> f3 = pool.submit(new MyCallable(300));Future<String> f4 = pool.submit(new MyCallable(400));Future<String> f5 = pool.submit(new MyCallable(500));//        String rs = f1.get();
//        System.out.println(rs);System.out.println(f1.get());System.out.println(f2.get());System.out.println(f3.get());System.out.println(f4.get());System.out.println(f5.get());}
}

Executors工具类实现线程池

Executors:线程池的工具类通过调用方法返回不同类型的线程池对象。

api

注意:Executors的底层其实也是基于线程池的实现类ThreadPoolExecutor创建线程池对象的。

Executors使用可能存在的陷阱

大型并发系统环境中使用Executors如果不注意可能会出现系统风险。

 

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

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

相关文章

第六年到第十年是分水岭

我今年懈怠了&#xff0c;觉得就这样了&#xff0c;看到知乎上有个大神的帖子&#xff0c;深受触动&#xff0c;前五年都差不多&#xff0c;第六年到第十年才是分水岭&#xff0c;是否愿意继续努力&#xff0c;才是关键。拷贝如下&#xff1a; 作者&#xff1a;技术王 来源&…

身为程序员哪一个瞬间让你最奔溃 ?

身为程序员&#xff0c;有时候最让我感到沮丧的瞬间之一是遇到难以追踪和解决的 Bug。这些 Bug 可能出现在我写的代码中&#xff0c;也可能是由于不可预测的外部因素引起的。其中一个让我最奔溃的瞬间是在一个大型项目中&#xff0c;我遇到了一个非常复杂的Bug&#xff0c;这个…

数据可视化加定语

自动化成果数据可视化 资产物料可视化 数据服务可视化 微服务架构的可观测性

uniapp生命周期详解

Uniapp的生命周期可以从以下三方面进行理解&#xff1a; 应用生命周期 应用生命周期是指应用程序从启动到关闭的整个过程&#xff0c;包括应用程序的启动、前后台切换、退出等。Uniapp提供了以下生命周期钩子函数&#xff1a; onLaunch&#xff1a;应用程序启动时触发&#…

Linux--网络概念

1.什么是网络 1.1 如何看待计算机 我们知道&#xff0c;对于计算机来说&#xff0c;计算机是遵循冯诺依曼体系结构的&#xff08;即把数据从外设移动到内存&#xff0c;再从内存到CPU进行计算&#xff0c;然后返回内存&#xff0c;重新读写到外设中&#xff09;。这是一台计算机…

HCIP-一、RSTP 特性及安全

一、RSTP 特性及安全 实验拓扑实验需求及解法 实验拓扑 实验需求及解法 //1.SW1/2/3是企业内部交换机&#xff0c;如图所示配置各设备名称。 //2.配置VLAN&#xff0c;需求如下&#xff1a; //1&#xff09;SW1/2/3创建vlan10 [SW1]vlan batch 10 [SW2]vlan batch 10 [SW3]vla…

【JavaSE】-4-循环结构

循环结构 循环结构是三大流程控制结构的最后一种&#xff0c;相比于顺序结构和分支结构&#xff0c;循环结构略复杂一些。 前面课程中已经说过&#xff0c;循环结构的特点是能够重复的执行某些代码。 循环结构的基本概念&#xff1a; 循环体&#xff1a;重复执行的代码称为循环…

深入理解Java AQS:从原理到源码分析

目录 AQS的设计原理1、队列节点 Node 和 FIFO队列结构2、state 的作用3、公平锁与非公平锁 AQS 源码解析1、Node节点2、acquire(int)3、release(int)4、自旋&#xff08;Spin&#xff09;5、公平性与 FIFO 基于AQS实现的几种同步器1、ReentrantLock&#xff1a;可重入独占锁2、…

HugeGraph安装与使用

1、HugeGraph-Server与HugeGraph-Hubble下载 HugeGraph官方地址&#xff1a;https://hugegraph.apache.org/ 环境为&#xff1a;linux 官网是有模块版本对应关系,尽量下载较新版本,hubble1.5.0之前是studio功能比较少。官网已经下架server,其他模块下载也比较慢。可以在网上找…

生成式 AI 落地制造业的关键是什么?亚马逊云科技给出答案

编辑 | 宋慧 出品 | CSDN 云计算 作为实体经济的重要组成部分&#xff0c;制造业一直以来都是国家发展的根本和基础。近年制造业的数字化转型如火如荼&#xff0c;今年爆火的生成式 AI 也正在进入制造业的各类场景。全球的云巨头亚马逊云科技从收购芯片公司自研开始&#xff0…

电力感知边缘计算网关产品设计方案-电力采集

1.电力监控系统网络环境 按照GB/T36572-2018《电力监控系统网络安全防护原则》对电力监测系统要求,电力监控系统具有可靠性、实时性、安全性、分布性、系统性的特性,可以具备防护黑客入侵、旁路控制、完整性破坏、越权操作、无意或故意行为、拦截篡改、非法用户、信息泄露、…

arkTs 零散知识点

基本组件 https://blog.csdn.net/morr_/article/details/128874333 justifyContent 设置子组件主轴上的对齐方式 alignItems 设置子组件交叉轴上的对齐方式 aboutToAppear 是一个被Component组件修饰的自定义租组件的生命周期方法。在创建组件的新实例后&#xff0c;执行…

机器视觉技术在现代汽车制造中的应用

原创 | 文 BFT机器人 机器视觉技术&#xff0c;利用计算机模拟人眼视觉功能&#xff0c;从图像中提取信息以用于检测、测量和控制&#xff0c;已广泛应用于现代工业&#xff0c;特别是汽车制造业。其主要应用包括视觉测量、视觉引导和视觉检测。 01 视觉测量 视觉测量技术用于…

JVM 性能调优

JVM 性能调优 JVM&#xff08;Java Virtual Machine&#xff09;性能调优是优化Java应用程序性能的关键步骤。以下是一些应该考虑的JVM性能调优方面&#xff1a; 一、 堆内存调整&#xff1a; 1、调整堆内存大小&#xff0c;包括新生代和老年代的大小。 ​ 了解程序的运行状…

分布式系统的认证授权

一.分布式系统的认证授权大致架构 以云音乐系统为例&#xff1a; 注&#xff1a;一般情况下&#xff0c;我们会把认证的部分的接口提取为一个单独的认证服务模块中。 二.单点登录&#xff08;Single Sign On&#xff09; 单点登录&#xff0c;Single Sign On&#xff0c;简称…

【Kafka】SpringBoot整合Kafka

1.引入依赖 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId></dependency> 2.配置参数 server:port: 8080 spring:kafka:bootstrap-servers: 101.34.251.168:9092producer: # ⽣产者re…

40.组合总和 II

原题链接&#xff1a;40.组合总和 II 思路&#xff1a; 太抽象了 建议看题解 代码随想录该题题解 全代码&#xff1a; class Solution { public:vector<vector<int>>result;vector<int> path;bool picking false;void backtracking(vector<int>&am…

C语言--输入三角形的三边,输出三角形的面积

一.题目描述 输入三角形的三边&#xff0c;输出三角形的面积。比如&#xff1a;输入三角形的三边长度是3&#xff0c;4&#xff0c;5.输出6 二.思路分析 利用海伦公式可以很好解决 海伦公式的表达式如下&#xff1a; s (a b c) / 2 面积 sqrt((s * (s - a) * (s - b) * (…

Python里面的数组移除第一个元素方法有哪些

在 Python 中&#xff0c;有多种方式可以去除数组&#xff08;列表&#xff09;中的第一个元素。 下面演示四种操作&#xff1a; 使用切片。你可以使用切片来获取从第二个元素开始到末尾的所有元素。例如&#xff1a; python my_list [1, 2, 3, 4, 5] my_list my_list[1:] #…