我的应用我做主:扩展线程池

自定义线程创建:ThreadFactory
线程池中的线程是从哪里来的呢?
ThreadPoolExecutor(int corePoolSize,//指定了线程池种的线程数量
int maximumPoolSize,//指定了线程池中的最大线程数量。
long keepAliveTime,// 当线程池数量超过了corePoolSize,多余的空闲线程的存活时间,即超过corePoolSize的空闲线程,在多长时间内会被销毁。
TimeUnit unit,//keepAliveTime的单位
BlockingQueue<Runnable> workQueue,//任务队列,被提交尚未被执行的任务。
ThreadFactory threadFactory,//线程工厂,用于创建线程,一般用默认的即可。
RejectedExecutionHandler handler)// 拒绝策略,当任务太多来不及处理,如何拒绝任务。

public class ExtThreadPool {public static class MyTask implements Runnable{public String name;public MyTask(String name){this.name = name;}@Overridepublic void run() {System.out.println("正在执行" + ":Thread ID:" + Thread.currentThread().getId()+ ",Task Name=" + name);try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {ExecutorService es = new ThreadPoolExecutor(5,5,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()){@Overrideprotected void beforeExecute(Thread t,Runnable r){System.out.println("准备执行"+((MyTask) r).name);}@Overrideprotected void afterExecute(Runnable r,Throwable t){System.out.println("执行完成"+((MyTask) r).name);}@Overrideprotected void terminated(){System.out.println("线程退出");}};for(int i=0;i<5;i++){MyTask task = new MyTask("Task");es.execute(task);try {Thread.sleep(10);} catch (InterruptedException e) {throw new RuntimeException(e);}}es.shutdown();}
}

比如:监控每个任务执行的开始时间和结束时间,或者其他一些自定义的增强功能,这时候该怎么办呢?
一个好消息是:ThreadPoolExecutor是一个可以扩展的线程池,它提供了
beforeExecute(),afterExecute()和terminated()三个接口来对线程池进行控制。

扩展原有线程池,实现了
beforeExecute,afterExecute,terminiate三个方法。
调用shutdown方法关闭线程池,这是一个比较安全的方法
如果当前正有线程在执行,shutdown方法
并不会立即暴力终止所有任务。
它会等待所有任务执行完成后,再关闭线程池。
当它并不会等待所有线程执行完成后再返回。
因此,可以简单地理解成shutdown方法只是发送了一个关闭
信号而已。但在shutdown方法后,这个线程池就不能再接收其他
新的任务了。

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

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

相关文章

信息收集 - 谷歌hack

搜索引擎 FOFA网络空间测绘:https://fofa.info/ FOFA(FOcus on Assets)是一个网络空间搜索引擎,可以帮助用户快速定位和收集特定目标的信息。 ZoomEye:https://www.zoomeye.org ZoomEye 是一个网络空间搜索引擎,可以用于发现和收集特定目标的网络设备、Web应用程序、开放…

【JAVA面试题】基本类型的强制类型转换是否会丢失精度?引用类型的强制类型转换需要注意什么?

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 思路 1、继承关系 2、运行时类型检查 结语 我的其他博客 前言 在Java编程中&#xff0c;强制类型转换是一个常见的操作&#xf…

操作系统 day15(信号量)

信号量机制 之前学习了这些解决进程互斥的方案 *但它们都无法实现“让权等待”&#xff0c;于是Dijkstra提出了一种卓有成效的实现进程互斥、同步的方法----信号量机制 总结&#xff1a;一个信号量对应一种资源。信号量的值这种资源的剩余数量&#xff08;信号量的值如果小于…

网络编程day2作业

TCP通信模型 TCP服务器端 #include<myhead.h>#define PORT 8888 #define IP "192.168.125.130"int main(int argc, const char *argv[]) {//创建文件描述符int sfd -1;if((sfd socket(AF_INET,SOCK_STREAM,0)) -1){perror("socket error");retu…

php伪协议 [SWPUCTF 2021 新生赛]PseudoProtocols

根据题目提示 我们直接用伪协议读取hint.php即可 php://filter/readconvert.base64-encode/resourcehint.php 我们把得到的编码拿去base64解密一下得到 那我们直接去访问一下 也可以用伪协议继续读取&#xff0c;只不过最后要base64解密一下 php://filter/readconvert.base6…

模拟电路基础知识经典 200问,收藏这些就够了!

大家总说模电知识总是学不会&#xff0c;IC修真院为大家整理了模电经典200问&#xff0c;看看你掌握了多少&#xff0c;文末可以获取全部哦。 文末可领全部文档 1、半导体材料制作电子器件与传统的真空电子器件相比有什么特点? 答&#xff1a;频率特性好、体积小、功耗小&…

Python并行编程详解:发挥多核优势的艺术

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在当今计算机时代&#xff0c;充分发挥多核处理器的性能是提高程序运行效率的关键。Python作为一门强大的编程语言&#xff0c;提供了多种并行编程工具和库。本文将深入介绍Python中的并行编程&#xff0c;探讨如…

基于第五代英特尔® 至强® 可扩展处理器的 ZStack Cube 超融合一体机

“在数字化转型的驱动下&#xff0c;超融合一体机的工作负载正在日趋复杂化&#xff0c;深度学习推理等新型工作负载的运行需求在不断增长。第五代英特尔 至强 可扩展处理器通过内核性能的提升&#xff0c;以及英特尔 AMX 等加速器的采用&#xff0c;帮助我们成功提升了超融合云…

获取一个程序或者代码的运行时间(以函数为例)

这是一种思路,在以后计算别的运行时间的时候也可以参考 使用头文件#include<time.h> 使用time_t定义两个时间戳变量,使用time()函数 -- time(&start)&#xff0c;接收一个指针作为参数,将1970年1月1日0时0分0秒到目前执行这条语句的相差的秒数。放到传入的指针变量…

力扣:205. 同构字符串(Python3)

题目&#xff1a; 给定两个字符串 s 和 t &#xff0c;判断它们是否是同构的。 如果 s 中的字符可以按某种映射关系替换得到 t &#xff0c;那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符&#xff0c;同时不改变字符的顺序。不同字符不能映射到同一个字符上…

Python中的面向对象编程

导读&#xff1a;本文旨在帮助读者从基础到高级逐步掌握Python的面向对象编程。 目录 OOP基础&#xff1a;构建块 类和对象 定义和实例化类 属性和方法 类属性和实例属性 继承 基本继承 深入理解OOP特性 封装 封装的概念 私有属性和方法 多态 多态性的好处 在Py…

C# 跨越配置

跨越配置1 项目框架 .NET Framework 1.web.config配置 在system.webServer节点中添httpProtocol子节点 Access-Control-Allow-Origin值为“*”” <httpProtocol><customHeaders><add name"Access-Control-Allow-Origin" value"*" /><…

鸿蒙ArkTS语言介绍与TS基础语法

1、ArkTS介绍 ArkTS是HarmonyOS主力应用开发语言&#xff0c;它在TS基础上&#xff0c;匹配ArkUI框架&#xff0c;扩展了声明式UI、状态管理等响应的能力&#xff0c;让开发者以更简洁、更自然的方式开发跨端应用。 JS 是一种属于网络的高级脚本语言&#xff0c;已经被广泛用…

Python: 函数参数是值传递还是引用传递

是引用传递。 Python的设计哲学是一切皆对象&#xff0c;不仅体现在内置数据类型、数据结构是对象&#xff0c;还包括Python编译运行需要的一些设施&#xff0c;比如stackframe、traceback等等。所以&#xff0c;为了更方便的传递数据&#xff0c;cpython内部全部采用指针传递…

共享类数据——class data share功能

CDS 前言定义创建归档文件创建基本归档文件使用归档文件注意事项 源码中体现 前言 现在系统原来越复杂&#xff0c;代码越来越多&#xff0c;启动程序需要加载大量的class文件&#xff0c;这样大量时间都耗在系统启动上。GraalVM原生镜像和Project CRaC都允许Spring Boot应用程…

用指针查找子串

本题要求实现一个字符串查找的简单函数。 函数接口定义&#xff1a; char *search( char *s, char *t ); 函数search在字符串s中查找子串t&#xff0c;返回子串t在s中的首地址。若未找到&#xff0c;则返回NULL。 裁判测试程序样例&#xff1a; #include <stdio.h> #…

React中也许你会用到的Context

文章概叙 本文主要是写React中Context的概念以及使用&#xff0c;请一定搞清楚什么时候使用Context Context的介绍 通常来说&#xff0c;你会通过 props 将信息从父组件传递到子组件。但是&#xff0c;如果你必须通过许多中间组件向下传递 props&#xff0c;或是在你应用中的…

OCC:第一个程序,对话框中显示一个BOX

1. OCC库的获取 从github上获取 gitgithub.com:tpaviot/oce.git&#xff0c;自己编译官网获取二进制包&#xff08;获取下来的只有release 版本的&#xff0c;而且VS版本不一定适合自己&#xff09;官网源码&#xff0c;然后自己编译&#xff08;稍微折腾点&#xff0c;建议按…

自动导入组件unplugin-auto-import和unplugin-vue-components

背景 当我们在Vue项目中使用第三方库或组件时&#xff0c;通常需要手动导入它们并在需要的地方进行注册。这可能会变得繁琐和冗长&#xff0c;特别是当我们使用大量的第三方库或组件时。为了简化这个过程&#xff0c;我们可以使用unplugin-auto-import和unplugin-vue-componen…

阻塞 IO(BIO)

文章目录 阻塞 IO(BIO)模型等待队列头init_waitqueue_headDECLARE_WAIT_QUEUE_HEAD 等待队列项使用方法驱动程序应用程序模块使用参考 阻塞 IO(BIO) 模型 等待队列是内核实现阻塞和唤醒的内核机制。 等待队列以循环链表为基础结构&#xff0c;链表头和链表项分别为等待队列头和…