B100-技能提升-线程池分布式锁

目录

      • 线程池
        • 什么是线程池?
        • 为什么用线程池?
        • 线程池原理
        • 常见四种线程池和自定义线程池

线程池

什么是线程池?

池化技术

为什么用线程池?

1 由于设置最大线程数,防止线程过多而导致系统崩溃。

2 线程复用,不需要频繁创建或销毁线程,并且销毁和创建是耗费时间和资源操作,所以提高了效率,节约资源。

线程池原理

在这里插入图片描述
核心线程,等待队列,非核心线程,拒绝策略

如果有空闲的线程直接使用,没有空闲的线程并且线程数量未达到corePoolSize,则新建一个线程(核心线程)执行任务

线程数量达到了corePoolSize,则将任务移入队列等待空闲线程将其取出去执行(通过getTask() 方法从阻塞队列中获取等待的任务,如果队列中没有任务,getTask()方法会被阻塞并挂起,不会占用cpu资源,整个getTask操作在自旋下完成)

队列已满,新建线程(非核心线程)执行任务,空闲下来以后,非核心线程会按照时间策略进行销毁

队列已满,总线程数又达到了maximumPoolSize,就会执行任务拒绝策略。

handler:表示当拒绝处理任务时的策略(①AbortPolicy丢弃任务并抛出RejectedExecution异常;②DiscardPolicy丢弃任务,但是不抛出异常;③DiscardOldestPolicy丢弃队列最前面的任务,然后重新尝试执行任务;④CallerRunsPolicy由调用线程处理该任务)

常见四种线程池和自定义线程池

见文档

代码

PoolTest1

public class PoolTest1 {public static void main(String[] args) {
//        ExecutorService executorService1 = Executors.newCachedThreadPool();
//        ExecutorService executorService2 = Executors.newFixedThreadPool(5);
//        ExecutorService executorService3 = Executors.newSingleThreadExecutor();
//        ScheduledExecutorService executorService4 = Executors.newScheduledThreadPool(5);ThreadPoolExecutor executorService = new ThreadPoolExecutor(5, 10, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<>(10), new ThreadPoolExecutor.AbortPolicy());// 执行任务-线程不用我们创建,交给线程池管理,只需要把执行逻辑放进去就OKfor (int i = 0; i < 20; i++) {int finalI = i;executorService.execute(new Runnable() {@Overridepublic void run() {System.out.println("Thread Name: "+Thread.currentThread().getName()+"  I="+ finalI);try {Thread.sleep(5*1000);} catch (InterruptedException e) {e.printStackTrace();}}});}executorService.shutdown();}
}

MyTask

public class MyTask implements Callable<String>  {private Integer integer1;private Integer integer2;public MyTask(Integer integer1,Integer integer2){this.integer1 =integer1;this.integer2 =integer2;}@Overridepublic String call() throws Exception {int i = integer1 + integer2;return "Thread name:" + Thread.currentThread().getName()+"  i="+i;}
}

PoolTest2

public class PoolTest2 {public static void main(String[] args) throws ExecutionException, InterruptedException {
//        ExecutorService executorService1 = Executors.newCachedThreadPool();
//        ExecutorService executorService2 = Executors.newFixedThreadPool(5);
//        ExecutorService executorService3 = Executors.newSingleThreadExecutor();
//        ScheduledExecutorService executorService4 = Executors.newScheduledThreadPool(5);ThreadPoolExecutor executorService = new ThreadPoolExecutor(5, 10, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<>(10), new ThreadPoolExecutor.AbortPolicy());// 执行任务-线程不用我们创建,交给线程池管理,只需要把执行逻辑放进去就OKArrayList<Future<String>> futures = new ArrayList<>();for (int i = 0; i < 20; i++) {MyTask myTask = new MyTask(3,4);Future<String> future = executorService.submit(myTask);// future.get()为myTask.call()的返回值futures.add(future);}List<String> resutlts = new ArrayList<>();for (int i = 0; i < futures.size(); i++) {String resutlt = futures.get(i).get();resutlts.add(resutlt);}System.out.println("===="+resutlts.get(19));executorService.shutdown();}
}

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

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

相关文章

包管理机制pip3

pip3 安装pip3 安装pip3 apt install python3-pip yum install python3-pip从仓库出发的命令 查询仓库信息 // 获取默认pip3源 pip3 config get global.index-url查询所有软件包 查询已经安装的所有软件包 pip3 list从软件包出发的命令 从软件包名出发查询其他信息 查询…

230. 二叉搜索树中第K小的元素

介绍 中序遍历&#xff1a;左子树 -> 中 -> 右子树 二叉搜索树&#xff1a;中序遍历可以得到有序的序列 递归法 1.使用函数循环递归处理 2.使用一个数组来保存 k, 保证在个个递归函数中都能看到 看的变化&#xff1b;每访问一个节点&#xff0c;这个数减一&#xff0c…

软件测试基础篇——Redis

Redis Redis数据库的配置与连接 解压redis数据库的安装包&#xff08;建议把解压后的安装包放到磁盘的根目录&#xff0c;方便访问操作&#xff09;打开【命令行窗口】&#xff1a;winR在命令行窗口&#xff0c;进入到redis安装目录中 ​ 格式一&#xff1a;cd /d redis目录…

Linux安装Zookeeper

1、Zookeeper简介 ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域…

自然语言处理从入门到应用——LangChain:记忆(Memory)-[记忆的类型Ⅲ]

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 对话令牌缓冲存储器ConversationTokenBufferMemory ConversationTokenBufferMemory在内存中保留了最近的一些对话交互&#xff0c;并使用标记长度来确定何时刷新交互&#xff0c;而不是交互数量。 from langchain.me…

基于灰狼优化(GWO)、帝国竞争算法(ICA)和粒子群优化(PSO)对梯度下降法训练的神经网络的权值进行了改进(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

环保行业如何开发废品回收微信小程序

废品回收是近年来受到越来越多人关注的环保行动。为了推动废品回收的普及和方便&#xff0c;我们可以利用微信小程序进行制作&#xff0c;方便人们随时随地参与废品回收。 首先&#xff0c;我们需要注册并登录乔拓云账号&#xff0c;并进入后台。乔拓云是一个提供微信小程序制作…

数据结构(一):顺序表详解

在正式介绍顺序表之前&#xff0c;我们有必要先了解一个名词&#xff1a;线性表。 线性表&#xff1a; 线性表是&#xff0c;具有n个相同特性的数据元素的有限序列。常见的线性表&#xff1a;顺序表、链表、栈、队列、数组、字符串... 线性表在逻辑上是线性结构&#xff0c;但…

【云原生】Pod详讲

目录 一、Pod基础概念1.1//在Kubrenetes集群中Pod有如下两种使用方式&#xff1a;1.2pause容器使得Pod中的所有容器可以共享两种资源&#xff1a;网络和存储。1.3kubernetes中的pause容器主要为每个容器提供以下功能&#xff1a;1.4Kubernetes设计这样的Pod概念和特殊组成结构有…

Django中级指南:理解并实现Django的模型和数据库迁移

Django 是一个极其强大的 Python Web 框架&#xff0c;它提供了许多工具和特性&#xff0c;能够帮助我们更快速、更便捷地构建 Web 应用。在本文中&#xff0c;我们将会关注 Django 中的模型&#xff08;Models&#xff09;和数据库迁移&#xff08;Database Migrations&#x…

上传代码到GitCode

Git 全局设置 git config --global user.name "AnyaPapa" git config --global user.email "fangtaihongqq.com" 添加SSH密钥 Mac终端输入命令 cd existing_folder git init git remote add origin gitgitcode.net:Java_1710/test.git git add . git co…

2023国赛数学建模A题思路分析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 全国大学生数学建模…

Mac电脑如何把照片以文件格式导出?

在Mac电脑上&#xff0c;我们经常会拍摄、保存和编辑各种照片。有时候&#xff0c;我们可能需要将这些照片以文件形式导出&#xff0c;以便与他人共享、打印或备份。无论您是要将照片发送给朋友、上传到社交媒体&#xff0c;还是保存到外部存储设备&#xff0c;导出照片为文件是…

我的Python教程:使用Pyecharts画柱状图

Pyecharts是一个用于生成 Echarts 图表的 Python 库。Echarts 是一个基于 JavaScript 的数据可视化库&#xff0c;提供了丰富的图表类型和交互功能。通过 Pyecharts&#xff0c;你可以使用 Python 代码生成各种类型的 Echarts 图表&#xff0c;例如折线图、柱状图、饼图、散点图…

java不支持解压rar5的解决办法--引用本地7zip.exe

由于rar5算法未开源&#xff0c;没有合适的JAVA依赖能够解决解压rar5。在运行中报错&#xff1a; javacom.github.junrar.exception.RarException: badRarArchive 通过引用本地7zip.exe&#xff0c;命令行执行解决&#xff1a; private static void unZipRar5File(String fileP…

探索可视化应用的崭新前景

在当今数据驱动的世界中&#xff0c;可视化应用成为了一种强大的工具&#xff0c;能够将复杂的数据转化为易于理解和分析的图形形式。随着技术的不断发展和创新&#xff0c;可视化应用正迎来崭新的前景。本文将介绍可视化应用的定义、重要性以及当前的发展趋势&#xff0c;并探…

Controller是单例还是多例?

Controller是单例还是多例&#xff1f; controller默认是单例的&#xff0c;不要使用非静态的成员变量&#xff0c;否则会发生数据逻辑混乱。正因为单例所以不是线程安全的。 我们下面来简单的验证下&#xff1a; package com.riemann.springbootdemo.controller;import org…

docker配置文件

/etc/docker/daemon.json 文件作用 /etc/docker/daemon.json 文件是 Docker 配置文件&#xff0c;用于配置 Docker 守护进程的行为和参数。Docker 守护进程是负责管理和运行 Docker 容器的后台进程&#xff0c;通过修改 daemon.json 文件&#xff0c;可以对 Docker 守护进程进…

不做Linux就没前途吗?

答案当然是——并不会 我晚上回来的时候跟一个今年的毕业生聊天&#xff0c;他入职了一家公司&#xff0c;但是从事的不是Linux相关的工作。 我这里想说的是&#xff0c;做Linux可以赚钱&#xff0c;Linux现在是全世界最牛逼的开源项目一点都不为过&#xff0c;但是Linux也不是…