多线程---线程池

1.概述

线程池(Thread Pool)是一种多线程处理形式,它允许一个或多个线程并行执行,以减少在创建和销毁线程上花费的时间以及系统资源的开销。线程池不仅提高了程序的响应速度,还增强了系统的吞吐量。

线程池主要由一个或多个创建好的线程和一个线程安全的任务队列组成。当需要执行新任务时,线程池会尝试从任务队列中获取任务,并由一个或多个空闲的线程来执行这些任务。如果所有线程都在忙,那么新任务就会在队列中等待,直到有线程空闲出来。

线程池中的线程数量可以根据需要进行调整,以适应不同的工作负载。线程池还提供了对并发执行的任务数量的控制,以及提供了一种机制来管理在应用程序中创建和销毁线程的过程。

2.线程池的实现的两种方式

Java中的java.util.concurrent.ExecutorService接口及其实现类(如ThreadPoolExecutor)提供了线程池的实现。

2.1.实例化ThreadPoolExecutor类

这种方式需要更多的配置和了解底层细节,因为你需要直接设置线程池的核心大小、最大大小、队列容量、拒绝策略等参数。例如:

  ThreadPoolExecutor executor = new ThreadPoolExecutor( corePoolSize, // 核心线程数 
  maximumPoolSize, // 最大线程数
  keepAliveTime, // 临时线程存活时间 
  TimeUnit.MILLISECONDS, // 临时线程存活的时间单位 
  workQueue, // 代表用于存放待执行任务的队列
  threadFactory,// 线程工厂
  handler // 拒绝策略 );

线程池使用图解

ExcutorService提供的线程池执行方法

线程池执行Runnable任务

package pool;

public class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread());
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
package pool;

import com.sun.jmx.remote.internal.ArrayQueue;

import java.sql.Time;
import java.util.concurrent.*;

public class Main {
    public static void main(String[] args) {
        //创建线程池
        ExecutorService pool = new ThreadPoolExecutor(3,
                5,
                8,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(3),
                Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
        //线程池创建一个新的任务执行Runnable任务
        Runnable runnable=new MyRunnable();

        pool.execute(runnable);
        pool.execute(runnable);
        pool.execute(runnable);


        pool.execute(runnable);
        pool.execute(runnable);
        pool.execute(runnable);

        pool.execute(runnable);
        pool.execute(runnable);


//        pool.execute(runnable);
    }
}

执行结果

拒绝策略

当再多添加一个任务,线程池就会拒绝分配线程,下面是默认的拒绝策略AbortPolicy

其他拒绝策略:

  1. AbortPolicy(默认策略):
    直接抛出RejectedExecutionException异常,阻止任务提交。
  2. CallerRunsPolicy:
    不抛出异常,也不丢弃任务,而是由调用者所在的线程来运行这个任务。这意味着提交任务的线程会负责执行该任务。
  3. DiscardPolicy:
    静默地丢弃无法处理的任务,不抛出任何异常。
  4. DiscardOldestPolicy:
    静默地丢弃队列中最旧的任务,然后尝试重新提交新任务。

线程池执行Callable任务

package pool;

import java.util.concurrent.Callable;

public class MyCallable implements Callable<String> {
    @Override
    public String call() throws Exception {
        Thread.sleep(1000);
        return Thread.currentThread().getName();
    }
}
package pool;

import com.sun.jmx.remote.internal.ArrayQueue;

import java.sql.Time;
import java.util.concurrent.*;

public class Main {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //创建线程池
        ExecutorService pool = new ThreadPoolExecutor(3,
                5,
                8,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(3),
                Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());

        //线程池创建新的任务执行Callable
        Callable<String> callable=new MyCallable();
        Future<String> submit1 = pool.submit(callable);
        Future<String> submit2 = pool.submit(callable);
        Future<String> submit3 = pool.submit(callable);
        Future<String> submit4 = pool.submit(callable);
        Future<String> submit5 = pool.submit(callable);
        Future<String> submit6 = pool.submit(callable);
        Future<String> submit7 = pool.submit(callable);
        Future<String> submit8 = pool.submit(callable);

        System.out.println(submit1.get());
        System.out.println(submit2.get());
        System.out.println(submit3.get());
        System.out.println(submit4.get());
        System.out.println(submit5.get());
        System.out.println(submit6.get());
        System.out.println(submit7.get());
        System.out.println(submit8.get());

    }
}

执行结果

2.2.通过Executors工厂类创建线程池

主要方法:

    • Executors.newFixedThreadPool(int nThreads):创建一个可重用固定线程数的线程池。如果所有线程都在工作,新提交的任务会等待,直到有线程空闲出来。
    • Executors.newSingleThreadExecutor():创建一个单线程的线程池。这意味着无论提交多少任务,它们都将按顺序执行。
    • Executors.newCachedThreadPool():创建一个可根据需要创建新线程的线程池,但在以前构造的线程可用时将重用它们。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如果很穷,不妨试一下这个副业,搞钱最快的副业!

前言 相信每一位学习计算机的朋友都想利用自己所学的知识赚点生活费&#xff0c;我也不例外&#xff0c;哈哈哈&#xff0c;学了这么多年&#xff0c;总得让它发挥点价值不是吗。今天就跟大家分享一下我的真实经历&#xff0c;我是如何利用python兼职实现月收入破万的。下面是…

Qt之条件变量QWaitCondition详解(从使用到原理分析全)

QWaitCondition内部实现结构图&#xff1a; 相关系列文章 C之Pimpl惯用法 目录 1.简介 2.示例 2.1.全局配置 2.2.生产者Producer 2.3.消费者Consumer 2.4.测试例子 3.原理分析 3.1.源码介绍 3.2.辅助函数CreateEvent 3.3.辅助函数WaitForSingleObject 3.4.QWaitCo…

Github 2024-02-14 开源项目日报 Top9

根据Github Trendings的统计&#xff0c;今日(2024-02-14统计)共有9个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Rust项目4TypeScript项目1PowerShell项目1Java项目1JavaScript项目1Jupyter Notebook项目1非开发语言项目1Pyth…

C++面向对象程序设计-北京大学-郭炜【课程笔记(三)】

C面向对象程序设计-北京大学-郭炜【课程笔记&#xff08;三&#xff09;】 1、构造函数&#xff08;constructor&#xff09;1.1、基本概念 2、赋值构造函数2.1、基本概念2.1、复制构造函数起作用的三种情况2.2、常引用参数的使用 3、类型转换构造函数3.1、什么事类型转换构造函…

linux 安装 docker

环境介绍 centos 7.9 检查系统内核版本。确保CentOS 7系统的内核版本高于3.10&#xff0c;可以通过命令uname -r查看当前的内核版本。 使用root权限登录CentOS。确保yum包更新到最新&#xff0c;使用命令 yum update。 卸载旧版本的Docker&#xff08;如果安装过旧版本的话…

【设计模式】0、uml 类图:关联、聚合、组合、依赖、继承、实现

文章目录 一、类的属性和方法二、类间的关系2.1 关联关系2.1.1 单向关联2.1.2 双向关联2.1.3 自关联 2.2 聚合关系2.3 组合关系2.4 依赖关系2.5 继承关系2.6 接口实现关系 一、类的属性和方法 类包含类名、属性&#xff08;field&#xff09;、方法&#xff08;methods&#x…

第13章 网络 Page747~749 asio核心类 ip::tcp::resolver

3&#xff0c; ip::tcp::resolver 如果新浪的IP地址变了&#xff0c;该怎么办呢? ip::tcp::resolver 可以帮我们用上www.sina.com.cn&#xff0c;因为它负责将人类可读的多种网址信息&#xff0c;一步 到位地解析成ip::tcp::socket建立连接所需要的ip::tcp::endpoint结构&…

项目第一次git commit后如何撤销

问题描述&#xff1a; # 1. 新建gitcode目录&#xff0c;然后在目录下 git init# 2. 用idea打开目录后&#xff0c;新建.gitignore文件后 git add .git commit -m "init project"git log# 3. 就出现如下图情况目的&#xff1a;向撤销该次代码提交 # 仅撤销 git com…

Jenkins 2.426.3新版设置中文

1. 插件页面显示无法联网 &#xff0c;点击Plugins一直提示连接超时&#xff0c;设置公司代理后 2. 稍等一会儿点击如下图&#xff0c;插件就出来了&#xff0c;然后输入Locale进行下载 3. 以下是我下载安装好的 4.打开设置&#xff0c;找到Locale选项&#xff0c;设置成zh_CN…

【总结】HTML+JS逆向混淆混合

国外的题果然考的与众不同 [secrypt_cen.html] 这次是HTML网页&#xff0c;然后JS加密判断 翻看JS代码 很显然&#xff0c;关键的代码在checkPassword JS混淆是必备的 去混淆一条龙走起 先将关键代码提取出来 JavaScriptfunction _0x4857(_0x398c7a, _0x2b4590) { const _0…

走进水墨世界,寻找传统之美

为深入了解中国传统水墨文化的底蕴及其在当代的价值&#xff0c;2024年2月16日&#xff0c;曲阜师范大学计算机学院“古韵新声&#xff0c;格物致‘知’”实践队的队员王涵智走进山东省高唐县巩德春艺术馆展开社会实践。实践队员以探访艺术馆为契机&#xff0c;领略传统水墨文化…

14. Longest Common Prefix(最长公共前缀)

问题描述 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 问题分析 方法一&#xff1a;我们可以假设一个字符串是最长的公共子串&#xff0c;然后去验证&#xff0c;如果此串被验证了&#xff0c;再增加一位字符进行验…

vue-自定义创建项目(六)

为什么要自定义创建项目&#xff1f; 因为VueCli默认创建的项目不能够满足我们的要求&#xff0c;比如默认的项目中没有帮我们集成路由&#xff0c;vuex&#xff0c;eslink等功能。 默认项目 自定义创建项目 流程&#xff1a; 创建项目命令&#xff1a;vue create custom_dem…

免费听歌软件,音乐搜索APP:掌中的音乐宝库,为您的音乐生活增添色彩

引言 在数字音乐的浪潮中&#xff0c;我们通常会想到QQ音乐、虾米、网易云音乐等主流平台APP。然而&#xff0c;这些商业软件在为用户提供服务的同时&#xff0c;也不可避免地伴随着一些限制和不尽如人意的地方&#xff0c;如曲库有限、音质不尽如人意或广告干扰或会员才能听歌…

2024年腾讯云4核8G12M轻量应用服务器测评,2月更新

4核8G服务器支持多少人同时在线访问&#xff1f;阿腾云的4核8G服务器可以支持20个访客同时访问&#xff0c;关于4核8G服务器承载量并发数qps计算测评&#xff0c;云服务器上运行程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&…

美国突然致敬中本聪

作者&#xff1a;秦晋 有点看不懂美国的神操作。 2月16日&#xff0c;据《Bitcoin Magazine》报道&#xff0c;比特币的竞争对手、美国参议员伊丽莎白-沃伦对比特币的立场突然180度大转弯。由反对立场转为支持立场。让很多行业媒体出乎意料&#xff0c;甚至惊掉下巴。 报道称&a…

linux基础命令和示例

redis在go语言中的使用 以下说明以读者有redis基础的前提下进行 未学习redis的可以到b站1小时浅学redis了解大概&#xff0c;学会如何使用 【GeekHour】一小时Redis教程_哔哩哔哩_bilibili 以下开发环境以windows为测试环境&#xff0c;旨在练习redis在go语言中的使用 red…

深度学习系列58:大模型训练和压缩

1. 大模型训练 1.1数据并行 1.2 模型并行 1.3 ZeRO 1.4 流水线并行 1.5 混合精度训练 1.6 offloading 把梯度放在cpu上保存和计算 1.7 overlapping 提前传输数据 1.8 checkpointing 中间线性层不保存&#xff0c;反向传播时再次重新计算 1.9 使用BMtrain 2. 大模型压…

[HTML]Web前端开发技术26(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;佬佬会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

Axios学习

文章目录 Axios1.Json-server的搭建2.Axios的基本使用3.Axios的其他使用4.Axios响应结果的结构分析5.Axios配置对象详细说明6.axios的默认配置7.axios创建实例对象&#xff08;create&#xff09;8.axios拦截器1.请求拦截器2.响应拦截器 9.取消请求10.源码分析 Axios 1.Json-s…