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

news2024/11/26 22:18:28

目录

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

线程池

什么是线程池?

池化技术

为什么用线程池?

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());

        // 执行任务-线程不用我们创建,交给线程池管理,只需要把执行逻辑放进去就OK
        for (int i = 0; i < 20; i++) {
            int finalI = i;
            executorService.execute(new Runnable() {
                @Override
                public 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;
    }
    @Override
    public 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());

        // 执行任务-线程不用我们创建,交给线程池管理,只需要把执行逻辑放进去就OK
        ArrayList<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.coloradmin.cn/o/872179.html

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

相关文章

WebAPIs 第三天

DOM 事件进阶 事件流事件委托其他事件元素尺寸与位置 一.事件流 事件流与两个阶段说明事件捕获事件冒泡阻止冒泡解绑事件 1.1 事件流与两个阶段说明 ① 事件流&#xff1a;指的是事件完整执行过程中的流动路径 ② 事件流分为捕获阶段和冒泡阶段 1.2 事件捕获 从DOM根元素…

opsForHash() 与 opsForValue 请问有什么区别?

&#x1f449;&#xff1a;&#x1f517;官方API参考手册 如图&#xff0c;opsForHash()返回HashOperations<K,HK,HV>但是 opsForValue()返回ValueOperations<K,V>… 区别就是opsForHash的返回值泛型中有K,HK,HV,其中K是Redis指定的某个数据库里面某一个关键字(由…

三分钟带你快速掌握MongoDB数据库和集合基础操作

文章目录 前言一、案例需求二、数据库操作1. 选择和创建数据库2. 数据库的删除 三、集合操作1. 集合的显式创建&#xff08;了解&#xff09;2. 集合的隐式创建3. 集合的删除 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便…

太牛了!国内版ChatDoc企业知识库,直接操作Doc、Docx、PDF、txt等文件

自ChatGPT问世以来&#xff0c;国外就有ChatPDF、ChatDOC等基于文档问答的项目&#xff0c;但是国内还一直处于对话类产品的研发中。 贵州猿创科技研发了基于本地向量模型的ChatDoc知识库系统&#xff0c;可以直接上传Doc、Docx、PDF、txt、网页链接等进行问答。 体验地址&…

【算法篇C++实现】常见查找算法

文章目录 &#x1f680;一、预备知识⛳&#xff08;一&#xff09;查找的定义⛳&#xff08;二&#xff09;数组和索引 &#x1f680;二、二分查找&#x1f680;三、穷举搜索&#x1f680;四、并行搜索⛳&#xff08;一&#xff09;并发的基本概念⛳&#xff08;二&#xff09;…

修改VS Code终端的显示行数

文章目录 前言修改VS Code终端显示行数参考 前言 在我们使用VS Code运行代码的过程中&#xff0c;有时需要再终端中显示很多的运行过程信息或者结果。然而&#xff0c;VS Code的终端默认显示1000行的内容&#xff0c;随着显示内容的增多&#xff0c;之前的内容就丢失了。为了解…

【单片机毕业设计2-基于stm32c8t6的智能台灯系统】

【单片机毕业设计2-基于stm32c8t6的智能台灯系统】 前言一、功能介绍二、硬件部分三、软件部分总结 前言 &#x1f525;这里是小殷学长&#xff0c;单片机毕业设计篇2 基于stm32的智能台灯系统 &#x1f9ff;创作不易&#xff0c;拒绝白嫖 企鹅号&#xff1a;2836235214 一、功…

Java IO流——【从零构建信息管理系统】

Java I/O流——【从零构建信息管理系统】 文章目录 什么是Java I/O流介绍理解字节流和字符流的区别 Java I/O流的作用Java I/O流方法InputStream方法Reader方法OutputStream方法Writer方法Java I/O体系的全体类 使用示例Java I/O流在实际应用中使用效果 什么是Java I/O流 介绍…

多线程事务怎么回滚?

项目中用到了多线程去批量处理一些数据&#xff0c;当时想当然认为只要方法上加上Transactional注解就好了&#xff0c;实际并未达到想要的处理效果。特此去学习了下关于多线程事务回滚相关方案&#xff0c;参考了网上其他资料&#xff0c;这里整理并记录下学习历程。 站在巨人…

在 IntelliJ IDEA 中使用 Docker 开发指南

目录 一、IDEA安装Docker插件 二、IDEA连接Docker 1、Docker for Windows 连接 2、SSH 连接 3、Connection successful 连接成功 三、查看Docker面板 四、使用插件生成镜像 一、IDEA安装Docker插件 打开 IntelliJ IDEA&#xff0c;点击菜单栏中的 "File" -&g…

山西电力市场日前价格预测【2023-08-14】

日前价格预测 预测明日&#xff08;2023-08-14&#xff09;山西电力市场全天平均日前电价为322.03元/MWh。其中&#xff0c;最高日前电价为366.98元/MWh&#xff0c;预计出现在19: 30。最低日前电价为286.57元/MWh&#xff0c;预计出现在13: 15。 价差方向预测 1&#xff1a; 实…

腾讯出了一个新聊天软件M8

众所周知&#xff0c;如今国内互联网&#xff0c;微信和QQ无疑是社交领域的霸主。 下载:https://www.123pan.com/s/BP5A-RW4xh.html 不过&#xff0c;它们也有各自局限性&#xff0c;比如难以结识新朋友、功能过于复杂等。 这让用户产生厌倦&#xff0c;再加上近几年AI、元宇…

标记垃圾,有三种色彩:四千长文带你深入了解三色标记算法

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…

SCSS的基本用法

1、声明变量 $ 声明变量的符号 $ 下面这张图左半部分是scss的语法&#xff0c;右半部分是编译后的css。&#xff08;整篇文章皆是如此&#xff09; 2、默认变量 !default sass 的默认变量仅需要在值后面加上 !default 即可。 如果分配给变量的值后面添加了 !default 标志…

jmeter通过BeanShell对接口参数进行MD5和HmacSHA256加密【杭州多测师_王sir】

一、在eclipse里面编写MD5加密算法 package com.Base64;import java.security.MessageDigest; import java.security.NoSuchAlgorithmException;public class Md5Utils {public static String md5(String sourceStr) {String result "";try {MessageDigest md Mess…

教你10分钟内学习如何CSS 设置网页打印时的样式

本文将教您开始为要打印的页面编写CSS所需要的一切提供帮助。 media 规则 If you’ve done any responsive design, you’ll already know about the media rule. As well as different screen sizes, media also lets you target “print” media. Here’s an example: 如果…

【CTF-web】修改请求头(XFF)

题目链接&#xff1a;https://ctf.bugku.com/challenges/detail/id/79.html 随意输入后可以看到需要本地管理员登录&#xff0c;得知这是一道需要修改XFF头的题。 XFF即X-Forwarded-For&#xff0c;该请求标头是一个事实上的用于标识通过代理服务器连接到 web 服务器的客户端的…

腾讯轻量云服务器搭建Node.js开发环境

1.购买腾讯云轻量应用服务器&#xff0c;登录 轻量应用服务器控制台&#xff0c;在 服务器 页面单击 新建。安装运行环境&#xff0c;选择为应用模板 > Web 开发场景 > Node.js 应用模板。 Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境&#xff0c;基于 Chrome V…

分布式文件存储系统-FastDFS

前言&#xff1a;FastDFS 是一个分布式文件存储系统&#xff0c;主要用于存储和管理大规模的文件数据&#xff0c;如图片、视频、文档等&#xff0c;是淘宝前架构师为了存储图片用C语言开发出来的系统。 服务端有两个组件 Tracker Server 与 Storage Server &#xff0c;对应两…

​API网关类型与区别​

什么是API网关&#xff1f; 在现代软件架构中&#xff0c;API&#xff08;应用程序编程接口&#xff09;网关起着重要的作用。它是一个中间层&#xff0c;用于管理和控制应用程序之间的通信。API网关可以提供一些关键功能&#xff0c;如流量控制&#xff0c;安全认证&#xff…