自定义线程池

1、CUDA 编程基础 GPU计算的发展历程与重要性。首先回顾了计算机技术的发展,特别是摩尔定律的影响,强调了计算能力的快速提升。然而,随着晶体管尺寸的缩小和频率的停滞,单线程性能增长放缓。为了继续提升性能,多核处理器开始普及,促使软件开发者开始考虑并行计算。介绍了延迟导向设计和吞吐量导向设计的概念,CPU和GPU分别代表了这两种设计方法。GPU是吞吐量导向的,拥有众多弱小的ALU,通过流水线处理提高算术吞吐量。GPU的成功在于其高并行性和高吞吐量,以及能够分摊高昂的固定成本的大量销售额。 阅读详情

自定义线程池

如果当前线程池中的线程数目小于corePoolSize,则每来一个任务,就会创建一个线程去执行这个任务;

如果当前线程池中的线程数目>=corePoolSize,则每来一个任务,会尝试将其添加到任务缓存队列当中,若添加成功,则该任务会等待空闲线程将其取出去执行;若添加失败(一般来说是任务缓存队列已满),则会尝试创建新的线程去执行这个任务;

如果队列已经满了,则在总线程数不大于maximumPoolSize的前提下,则创建新的线程

如果当前线程池中的线程数目达到maximumPoolSize,则会采取任务拒绝策略进行处理;

如果线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止,直至线程池中的线程数目不大于corePoolSize;如果允许为核心池中的线程设置存活时间,那么核心池中的线程空闲时间超过keepAliveTime,线程也会被终止。

废话不多说,上手撸代码!

先把这个代码copy到你的main函数,毕竟都是这个封装的,咱们也封装封装玩玩~

               new ThreadPoolExecutor(nThreads, nThreads,
                                              0L, TimeUnit.MILLISECONDS,
                                              new LinkedBlockingQueue<Runnable>());
             

然后封装到这个样子:

package com.toov5.ThreadPoolTest;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

class TaskThread implements Runnable{
     private String threadName;
    public TaskThread(String thradName) {
        this.threadName=thradName;
    }     
     @Override
    public void run() {
        System.out.println(threadName);
    }
     
     
}  

public class DefinedThreadPool {

       public static void main(String[] args) {
           //核心线程数1 最大线程数2    1是实际运行的线程数 2是最多可以创建的线程数    后面的表示存活的时间(如果线程有空闲 超时时间 节约内存回收掉)
           //这里是0L 用完就杀死了 不回收了 最好设置超时时间 配置30s 有时候配置太长线程不能立马被复用到 太短容易产生超时
           //单位是毫秒 
           //队列的初始化值是3 
        ThreadPoolExecutor threadPoolExecutor =  new ThreadPoolExecutor(1, 2,
                                              0L, TimeUnit.MILLISECONDS,
                                              new LinkedBlockingQueue<Runnable>(3));

        
        //任务1现在创建线程 执行
        threadPoolExecutor.execute(new TaskThread("任务1"));
        //两个任务 任务2大于1 此时的队列大小是(3)没有满 那么任务2进入队列
        threadPoolExecutor.execute(new TaskThread("任务2"));
        threadPoolExecutor.execute(new TaskThread("任务3"));
       } 
  
    }       
       
       
    

任务 2 任务3 此时放到队列去了

 结果:

 

下面搞坏他!哈哈哈

package com.toov5.ThreadPoolTest;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

class TaskThread implements Runnable{
     private String threadName;
    public TaskThread(String thradName) {
        this.threadName=thradName;
    }     
     @Override
    public void run() {
        System.out.println(threadName);
    }
     
     
}  

public class DefinedThreadPool {

       public static void main(String[] args) {
           //核心线程数1 最大线程数2    1是实际运行的线程数 2是最多可以创建的线程数    后面的表示存活的时间(如果线程有空闲 超时时间 节约内存回收掉)
           //这里是0L 用完就杀死了 不回收了 最好设置超时时间 配置30s 有时候配置太长线程不能立马被复用到 太短容易产生超时
           //单位是毫秒 
           //队列的初始化值是3 
        ThreadPoolExecutor threadPoolExecutor =  new ThreadPoolExecutor(1, 2,
                                              0L, TimeUnit.MILLISECONDS,
                                              new LinkedBlockingQueue<Runnable>(3));

        
        //任务1现在创建线程 执行
        threadPoolExecutor.execute(new TaskThread("任务1"));
        //两个任务 任务2大于1 此时的队列大小是(3)没有满 那么任务2进入队列
        threadPoolExecutor.execute(new TaskThread("任务2"));
        threadPoolExecutor.execute(new TaskThread("任务3"));
        threadPoolExecutor.execute(new TaskThread("任务4"));
        threadPoolExecutor.execute(new TaskThread("任务5"));
        threadPoolExecutor.execute(new TaskThread("任务6"));
       } 
  
    }       
       
       
    

看吧:

报错了!

 分析下:

package com.toov5.ThreadPoolTest;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

class TaskThread implements Runnable{
     private String threadName;
    public TaskThread(String thradName) {
        this.threadName=thradName;
    }     
     @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+threadName);
    }
     
     
}  

public class DefinedThreadPool {

       public static void main(String[] args) {
           //核心线程数1 最大线程数2    1是实际运行的线程数 2是最多可以创建的线程数    后面的表示存活的时间(如果线程有空闲 超时时间 节约内存回收掉)
           //这里是0L 用完就杀死了 不回收了 最好设置超时时间 配置30s 有时候配置太长线程不能立马被复用到 太短容易产生超时
           //单位是毫秒 
           //队列的初始化值是3 
        ThreadPoolExecutor threadPoolExecutor =  new ThreadPoolExecutor(1, 2,
                                              0L, TimeUnit.MILLISECONDS,
                                              new LinkedBlockingQueue<Runnable>(3));

        
        //任务1现在创建线程 执行
        threadPoolExecutor.execute(new TaskThread("任务1"));
        //两个任务 任务2大于1 此时的队列大小是(3)没有满 那么任务2进入队列
        threadPoolExecutor.execute(new TaskThread("任务2"));
        threadPoolExecutor.execute(new TaskThread("任务3"));
        threadPoolExecutor.execute(new TaskThread("任务4"));
        threadPoolExecutor.execute(new TaskThread("任务5"));
//        threadPoolExecutor.execute(new TaskThread("任务6"));
       } 
  
    }       
       
       

 

线程就两个 1和2 来回复用  线程池就一个

最大线程数+队列缓存数      一旦超过就报错

大家可以自己玩玩体验一把,如果我执行的是1-5的任务 那么都是线程1 2 来复用

但是如果超过了 队列数+核心线程数 那么就要创新信的线程了,大家可以试试玩玩

 

核心线程数 是实际运行的线程数  

最大线程数 是可以创建的线程数   大于等于最大线程数那么会 拒绝任务了

如果超出了队列数量并且没有超出最大线程数 则创建新的线程 并且也会加入复用的行列

 

保证所有真正线程都能 被实际用到 核心线程数 实际运行的线程

最大线程数 最多可以创建多少个线程

大家可以这么理解 

 

1️⃣ Coze智能体基础入门教学(2025年全新版本) 不妨设想一下,倘若我们能够打造出一个数字助手,它不但能精准洞悉我们的需求,更可以独立思索、学习以及付诸行动,这便是 AI Agent 的基础理念。它恰似计算机世界里的 “智慧精灵”,能够感知周遭环境、做出判断并采取行动。AI Agent 的发展之路精彩纷呈。它走过了三个重要阶段:起初,它犹如一个被规则束缚的机器人,只能按预设好的指令开展工作。接着,它学会运用统计学方法,通过分析数据来做决策,变得越发灵活。到如今,凭借深度学习技术,它已经能够像人类一样去学习复杂的任务了。 阅读详情

相关推荐

ZYNQ裸机双网口通信实战:手把手教你用SDK和LWIP配置PS+PL以太网(附完整源码)

本文详细介绍了在ZYNQ裸机环境下实现双网口通信的全流程,包括硬件配置、LWIP协议栈优化及TCP通信实现。通过Vivado SDK和LWIP协议栈,开发者可以高效配置PS端内置网口与PL端扩展网口,提升嵌入式网络应用的灵活性和性能。附完整源码,助力快速开发。

weixin_30831529的博客 422

【Thread】线程池的 7 种创建方式及自定义线程池

1. 什么是线程池 线程池(ThreadPool)是一种基于池化思想管理和使用线程的机制。它是将多个线程预先存储在一个“池子”内,当有任务出现时可以避免重新创建和销毁线程所带来性能开销,只需要从“池子”内取出相应的线程执行对应的任务即可。 使用线程池主要有以下优点: 降低资源消耗 提高响应速度 提高线程的可管理性 同时,阿里巴巴在其《Java开发手册》中也强制规定:线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。 2. 使用线程池 线程池的创建方法总共有 7 种,但总体来说可分为 2 类:

sco5282的博客 3万+

1173:阶乘和

1173:阶乘和 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 6010 通过数: 3049 【题目描述】 用高精度计算出S=1!+2!+3!+…+n!(n≤50),其中“!”表示阶乘,例如:5!=5×4×3×2×1。 输入正整数n,输出计算结果S。 【输入】 一个正整数n。 【输出】 计算结果S。 【输入样例】 5 【输出样例】 153 思路: ...

zqhf123的博客 1261

Java自定义线程池

一、Java语言本身也是多线程,回顾Java创建线程方式如下: 1、继承Thread类,(Thread类实现Runnable接口),来个类图加深印象。 2、实现Runnable接口实现无返回值、实现run()方法,啥时候run,黑话了。 3、实现Callable接口重写call()+FutureTask获取. public class CustomThread { public static void main(String[] args) { // 自定义线程 .

今天又是充满希望的一天 1万+

构造地貌研究入门:手把手教你用ArcGIS插件CalHypso分析流域地貌形态

本文详细介绍了如何使用ArcGIS插件CalHypso进行流域地貌形态分析,包括工具安装、数据预处理、HI曲线生成及结果解读等关键步骤。通过实战操作,帮助读者掌握面积高程积分(HI)曲线的应用技巧,为构造地貌研究提供量化工具。

weixin_33704234的博客 105

第28节:cesium 加载高程数据(含源码+视频)

cesium 加载高程(地形)数据

qq_29384639的博客 1741

【详解】线程池及其自定义线程池的实现

1. 为什么使用线程池?线程池是运用场景最多的并发框架,几乎所有需要一步或者并发执行任务的程序都可以使用线程池。使用线程池一般有以下三个好处:①降低资源的消耗,通过重复利用已经创建的线程降低线程创建和销毁造成的消耗。②提高相应速度,当任务到达的时候,任务可以不需要等到线程创建就能立刻执行。③提高线程的可管理性,线程是稀缺资源,使用线程池可以统一的分配、调优和监控。2. Java中的线程池ThreadPool 线程池参数介绍 1)corePoolSize(线程池的基本大小):当提交一个任务到线程池时,线程

Money、坤的博客 2247

ARFoundation系列讲解-教程目录

一、教程目录 ARFoundation快速入门-01简介 ARFoundation快速入门-02环境搭建 ARFoundation快速入门-03环境配置之iOS ARFoundation快速入门-04环境配置之Android ARFoundation快速入门-05ARKit设备支持列表 ARFoundation快速入门-06ARCore设备支持列表 ARFoundation快速入门-07检查设备支持 ARFoundation快速入门-08平面检..........

a451319296的博客 3万+

线程池各个参数详解以及如何自定义线程池

一:为什么要自己定义线程池 虽然jdk提供了几种常用特性的线程池给我们,但是很多时候,我还是需要自己去自定义自己需要特征的线程池。并且阿里巴巴规范手册里面,就是不建议使用jdk的线程池,而是建议程序员手动创建线程池。 为什么呢?原文如下 【强制】线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规...

hello world 2万+

有之以为利,无之以为用,在 RAP 开发里的虚实取舍

摘要(149字) SAP RAP框架通过"有"与"无"的哲学平衡实现业务应用价值。其"有"体现在CDS视图、行为定义、服务绑定等具体对象,为系统提供形体;而"无"则表现为保留的扩展空间、未暴露的实现细节和框架托管的生命周期。在采购审批应用中,RAP既通过明确定义的行为模型建立业务语义,又通过验证、动作等机制保持灵活性。这种架构既确保核心功能稳固,又为未来演进留出余地,印证了"有之以为利,无之以为用"的技术智慧

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1305

搭建一个简单的 Django + Vue 项目

在本文中,我将为您详细介绍如何搭建一个简单的 Django + Vue 项目。Django 是一个使用 Python 编写的高级 Web 框架,而 Vue 是一个流行的 JavaScript 框架,用于构建用户界面。通过结合 Django 和 Vue,我们可以创建强大的全栈 Web 应用程序。创建 Django 项目设置 Django 后端创建 Vue 前端连接 Django 和 Vue让我们开始吧!

JfpBlockchain的博客 352

SpringBoot 自定义线程池

1.我们都知道spring只是为我们简单的处理线程池,每次用到线程总会new 一个新的线程,效率不高,所以我们需要自定义一个线程池。 2.自定义线程池有两种方法,第一种自定义线程池然后使用自己的自定义的,第二种重写spring默认的线程池,然后使用自己重写过的线程池 一:自定义线程池 1.1 修改application.yml #线程池配置参数 task: pool: cor...

适恒 1万+

AgentScope实战训练营:从零搭建一个完整的A2A Agent应用

2024年4月,Google在Google Cloud Next大会上正式提出了A2A(Agent-to-Agent)协议,这是一个开放协议,旨在让不同的AI Agent之间能够像微服务一样相互发现、相互调用。通俗地讲:A2A协议就是AI Agent世界的HTTP协议——有了它,一个Agent可以把自己的能力以标准化的方式暴露出去,另一个Agent可以无缝地发现并调用它。本文将基于阿里巴巴开源的(Apache 2.0协议),手把手带你从零搭建一个完整的A2A Agent应用。

program哲学 565

线程池监控——自定义线程池

    如果在系统中大量使用线程池,则有必要对线程池进行监控,方便在出现问题时,可以根据线程池的使用状态快速定位问题。可以根据线程池提供的参数进行监控,常用属性如下:    taskCount:线程池需要执行的任务数量    completedTaskCount:已完成的任务数量    largestPoolSize:线程池曾经创建过的最大线程数量,可以推测出是否达到corePoolSize和Ma...

墨者的博客 2082

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

如何自定义线程池

如何自定义线程池 //自定义线程池 public class ThreadPoolExecutorDemo { public static void main(String[] args) { //得到自己电脑cpu是几核的 一般maximumPoolSize默认 为自己电脑cpu为几核 +1 或者 +2 System.out.println(Runtime.getRuntime().availableProcessors()); ExecutorSe

syh_IT 3588

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

springboot自定义线程池

SpringBoot 自定义线程池_适恒-优快云博客_springboot自定义线程池 1.我们都知道spring只是为我们简单的处理线程池,每次用到线程总会new 一个新的线程,效率不高,所以我们需要自定义一个线程池。 2.自定义线程池有两种方法,第一种自定义线程池然后使用自己的自定义的,第二种重写spring默认的线程池,然后使用自己重写过的线程池 一:自定义线程池 1.1 修改application.yml #线程池配置参数 task: pool: corePoolSi.....

weixin_52774180的博客 4067

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

线程池使用之自定义线程池

线程池使用之自定义线程池

qq_61313896的博客 1270

线程池原理之自定义线程池

一、队列 先说一下线程池底层的数据结构 队列:一种线性表,它的特性是先进先出,插入在一端,删除在另一端。 队列又分为阻塞队列BlockingQueue和非阻塞队列ConcurrentLinkedQueue                                      生产者生产元素插入队列,消费者消费元素在另一端删除(假定队列的容量为10) 它们两者的区别: 1、非阻塞队...

zimo_1993的博客 1020

java自定义线程池总结

  创建线程池的方法有两种,一种是手动创建,一种是自动创建,本文将分别介绍这两种方式的简单使用。 

皓月星辰 6302

Java线程-线程池-自定义线程池

自定义线程池,代码如下: public class ThreadExtend_Pool_Custom extends Thread { private String name;//线程的名字 public ThreadExtend_Pool_Custom(String name){ this.name=name; } @Override pu...

brimen的博客 4049

JAVA线程池总结及自定义线程池

引言 在前几年小编写过一篇关于线程池的总结:《线程总结》,现在回过头来看,总结的 还是比较详细的,不过当时并没有在项目中有过真实刺激的 体验,最近项目中偶然遇到了一次任务丢失的问题,我追踪了一下 代码, 发现由于不正当采用java内置线程池导致的, 应该是当时配置线程池的参数没有仔细计算导致的,关于这个问题我们后面博文在介绍,今天我们在看我java 内置 线程池代码以后,我们先动手自己写一个线程池来实现任务的提交和执行。这样我们可以更好的理解线程池的执行流程。如果读者对于java内置的线程的核心参数和执行

Jack 架构师之路 14万+

自定义线程池总结

自定义线程池总结 一、四种线程池 Java通过Executors提供四种线程池,分别为: 1、newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。 2、newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。 3、newScheduledThreadPool 创建一个可定期或者延时执行任务的定长线程池,支持定时及周期性任务执行。 4、new

qq_41057728的博客 288
上一篇: 线程池原理剖析
下一篇: 合理配置线程池
Art&Code
博客等级 码龄7年 77粉丝 554原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值