package com.example.qiwei.tinker;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor.AbortPolicy;
import java.util.concurrent.TimeUnit;
/**
* 一个简易的线程池管理类,提供三个线程池
*/
public class ThreadManager {
// We want at least 2 threads and at most 4 threads in the core pool,
// preferring to have 1 less than the CPU count to avoid saturating
// the CPU with background work 核心池数量被限定在2到4之间。
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
public static final String DEFAULT_SINGLE_POOL_NAME = "DEFAULT_SINGLE_POOL_NAME";
private static final int CORE_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT - 1, 4));
private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
private static final int KEEP_ALIVE_SECONDS = 30;
private static ThreadPoolProxy mLongPool = null;
private static final Object mLongLock = new Object();
private static ThreadPoolProxy mShortPool = null;
private static final Object mShortLock = new Object();
private static ThreadPoolProxy mDownloadPool = null;
private static Object mDownloadLock = new Object();
private static Map<String, ThreadPoolProxy> mMap = new HashMap<String, ThreadPoolProxy>();
private static final Object mSingleLock = new Object();
/**
* 获取下载线程
*/
public static ThreadPoolProxy getDownloadPool() {
synchronized (mDownloadLock) {
if (mDownloadPool == null) {
mDownloadPool = new ThreadPoolProxy();
}
return mDownloadPool;
}
}
/**
* 获取一个用于执行长耗时任务的线程池,避免和短耗时任务处在同一个队列而阻塞了重要的短耗时任务,通常用来联网操作
*/
public static ThreadPoolProxy getLongPool() {
synchronized (mLongLock) {
if (mLongPool == null) {
mLongPool = new ThreadPoolProxy();
}
return mLongPool;
}
}
/**
* 获取一个用于执行短耗时任务的线程池,避免因为和耗时长的任务处在同一个队列而长时间得不到执行,通常用来执行本地的IO/SQL
*/
public static ThreadPoolProxy getShortPool() {
synchronized (mShortLock) {
if (mShortPool == null) {
mShortPool = new ThreadPoolProxy();
}
return mShortPool;
}
}
/**
* 获取一个单线程池,所有任务将会被按照加入的顺序执行,免除了同步开销的问题
*/
public static ThreadPoolProxy getSinglePool() {
return getSinglePool(DEFAULT_SINGLE_POOL_NAME);
}
/**
* 获取一个单线程池,所有任务将会被按照加入的顺序执行,免除了同步开销的问题
*/
public static ThreadPoolProxy getSinglePool(String name) {
synchronized (mSingleLock) {
ThreadPoolProxy singlePool = mMap.get(name);
if (singlePool == null) {
singlePool = new ThreadPoolProxy();
mMap.put(name, singlePool);
}
return singlePool;
}
}
public static class ThreadPoolProxy {
private ThreadPoolExecutor mPool;
private ThreadPoolProxy() {
}
/**
* 执行任务,当线程池处于关闭,将会重新创建新的线程池
*/
public synchronized void execute(Runnable run) {
if (run == null) {
return;
}
if (mPool == null || mPool.isShutdown()) {
//参数说明
//当线程池中的线程小于mCorePoolSize,直接创建新的线程加入线程池执行任务
//当线程池中的线程数目等于mCorePoolSize,将会把任务放入任务队列BlockingQueue中
//当BlockingQueue中的任务放满了,将会创建新的线程去执行,
//但是当总线程数大于mMaximumPoolSize时,将会抛出异常,交给RejectedExecutionHandler处理
//mKeepAliveTime是线程执行完任务后,且队列中没有可以执行的任务,存活的时间,后面的参数是时间单位
//ThreadFactory是每次创建新的线程工厂
mPool = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE_SECONDS, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), Executors.defaultThreadFactory(), new AbortPolicy());
}
mPool.execute(run);
}
/**
* 取消线程池中某个还未执行的任务
*/
public synchronized void cancel(Runnable run) {
if (mPool != null && (!mPool.isShutdown() || mPool.isTerminating())) {
mPool.getQueue().remove(run);
}
}
/**
* 取消线程池中某个还未执行的任务
*/
public synchronized boolean contains(Runnable run) {
if (mPool != null && (!mPool.isShutdown() || mPool.isTerminating())) {
return mPool.getQueue().contains(run);
} else {
return false;
}
}
/**
* 立刻关闭线程池,并且正在执行的任务也将会被中断
*/
public void stop() {
if (mPool != null && (!mPool.isShutdown() || mPool.isTerminating())) {
mPool.shutdownNow();
}
}
/**
* 平缓关闭单任务线程池,但是会确保所有已经加入的任务都将会被执行完毕才关闭
*/
public synchronized void shutdown() {
if (mPool != null && (!mPool.isShutdown() || mPool.isTerminating())) {
mPool.shutdownNow();
}
}
}
}
相关推荐
实现高性能线程管理:ThreadManager类详解与实战
线程管理是指在应用程序中创建、执行和控制线程的过程。线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。线程管理涉及到线程的生命周期控制,包括线程的创建、启动、阻塞、解除阻塞、终止等操作。线程池是多线程处理中的一种技术,其核心思想在于预先创建一组线程,并将待处理的任务分配给这些线程执行。线程池通过复用线程来减少资源消耗,并且可以有效控制并发执行的数量,从而提升应用的性能和响应速度。
ThreadManager分析
类图如下: ThreadManager是采用单例模式创建的:ThreadManager* ThreadManager::Instance() { RTC_DEFINE_STATIC_LOCAL(ThreadManager, thread_manager, ()); return &thread_manager; }#define RTC_DEFINE_STATIC_LOCAL(type,
C#管理线程池的类ThreadManager
C#管理线程池的类 /* How to use Thread Classs * * ============== * public ELMService() { InitializeComponent(); etm.ClalThreadPool("EmailThreads", (uint)ApplicationInfo.EmailParsingThreads); } * //queue items in thread for processing. * etm.QueueUserEmailWorkItem(new WaitCallback(ELMService_UpdateLogHandler), objSupplier); public void ELMService_UpdateLogHandler(object objmsg) * { * return; * } * */
线程管理(Thread Management)
OS X或iOS每个进程(应用)是由一个或多个线程组成,每个线程代表通过应用代码执行的一个路径。每个应用从一个线程开始,用来运行应用的main函数。应用可以产生额外的线程,每个线程执行特定功能的代码。 当应用生成一个新线程时,该线程成为应用进程空间内的独立实体。每个线程都有自己的执行堆栈并且由内核独立安排运行时。一个线程可以与其他线程和其他进程通信,执行 I/O 操作,和其他任何你需要做的。
ESP32系列之LVGL(四):输入设备(外部按键)对接
本文详细介绍了如何在ESP32上使用LVGL库对接外部按键作为输入设备,包括硬件连接、驱动层实现和LVGL输入设备移植。通过具体代码示例和实战案例,帮助开发者快速实现按键控制UI界面,解决常见问题如按键无反应和控件跳转不正常。
【笔记软件obsidian】从入门到精通
目录 一、前言 二、下载及安装 三、【选修】ios用户如何通过iCloud进行三平台同步 四、基本Markdown语法 五、【选修】插件的下载及安装方式 六、
WebRTC学习进阶之路 --- 十四、源码分析之WebRTC中的线程详解-ThreadManager&Thread
WebRTC学习进阶之路系列总目录:https://blog.youkuaiyun.com/xiaomucgwlmx/article/details/103204274 前言 WebRTC源码中的很多注释是很赞的,看源码的时候多加阅读注释有助于更好的理解。 WebRTC实现了跨平台(Windows,MacOS,Linux,IOS,Android)的线程类rtc::Thread,WebRTC内部的netwo...
别再到处找资源了!WinCC 7.5 SP2官方下载与Windows 10保姆级安装避坑指南
本文提供了WinCC 7.5 SP2在Windows 10上的官方下载与安装全流程指南,重点解决了资源获取难、系统兼容性问题及分卷压缩处理等常见痛点。通过详细的步骤和实用技巧,帮助用户顺利完成安装并优化配置,适用于工控领域的学习者和从业者。
thrift 框架源码:线程池管理类 ThreadManager
thrift/lib/cpp/src/thrift/concurrency 这个路径下基本是thrift用到的多线程相关的代码 ThreadManager 原注释: 这是一个线程池管理类,用线程工厂创建线程。 初始化后,不会再创建线程或销毁线程,而是保存空闲线程数变量、活跃线程数变量 维护一个任务(task)队列,并平衡服务的响应与等待时间,通知线程池策略对象(PoolPolicy ob...
ubuntu17.04 UHD 驱动出错
ubuntu 17.04 源码安装UHD
使用python读取卫星测高数据并做相应的处理
5.在python处理结果如下,最大的优点就是比matlab快30-40倍。4.进行粗差的如NaN值,还有进行3倍方差进行对粗差处理。1.首先遍历卫星数据的文件,挨个读取每个数据。有问题,请各位读者及时告知,一起完善内容。3.进行下一步,筛选在研究区域的数据。4.进行按天求平均和按月求平均。2.读取数据主体代码。
网络访问频繁的项目---ThreadManager(线程池管理类)
一、先了解ThreadPoolExecutor这个类。
NVIDIA驱动装好了,Gazebo为啥还是卡?手把手教你用optirun搞定GPU加速
本文详细解析了NVIDIA驱动安装后Gazebo仍卡顿的原因,并提供三步精准诊断与GPU加速实战方案。通过optirun快速启用GPU加速,解决OpenGL与显示服务器的配置问题,显著提升仿真性能。适用于ROS、PX4等开发环境,帮助用户充分利用显卡性能。
Thrift ThreadManager以及三个Monitor作用
目录 一、ThreadManager 二、三个Monitor (1) monitor_ (2) workerMonitor_ (3) maxMonitor_ 一、ThreadManager 作用:线程池管理类,用线程工厂创建线程 特点:不会创建线程或销毁线程,而是保存空闲线程数变量、活跃线程数变量; 维护一个任务(task)队列,并平衡服务的响应与等待时间,通知线程池策略对象(PoolPolicy object)相关的信息,由PoolPolicy object 决定池大小调整,这样的好处.
大模型实战—通义千问大模型微调
这个参数仅针对 llama 类型的模型结构,默认勾选的是 q_proj 和 v_proj,具体的名词不容易理解,我就不多说了,可以简单的认为是对模型的理解能力进行优化,一般这两个就够了。当这个值较高时,适应新任务的能力会增强,但是对基础模型的影响会比较大,有过拟合的风险,尤其是在数据量有限的情况下。为了方便测试,我在云环境也创建了一个镜像,相关的环境都配置好了,可以直接使用几个国内开源的大语言模型,比如清华智谱的ChatGLM3-6B、零一万物的Yi-34B,还有最近阿里云开源的Qwen1.5-32B。
【华为OD机试】真题-小明减肥(Java)
摘要:题目要求从n个可选运动中选取k个,使其卡路里总和等于目标值t,统计可行方案数。输入包含运动数量n、目标t、选择数量k及卡路里数组。采用DFS回溯算法,通过剪枝优化(提前终止无效分支),分别处理选择/不选当前运动的情况。当遍历完所有运动且满足条件时计数。示例输入"4 3 2"和"1 2 3"时,输出2(对应两种选择组合)。Java实现通过递归完成搜索,最终输出符合条件的方案总数。(149字)
Java ThreadManager(线程池管理类)-网络频繁访问处理机制
http://www.aichengxu.com/view/32152
老版QQ原生表情gif动态
这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。
别new Thread(),简单实现线程管理ThreadManager
直接开车......复制代码直接上代码,ThreadManager类:public class ThreadManager { //获取内核数量 private final static int NUMBER_OF_CORES = Runtime.getRuntime().availableProcessors(); private final static T...
数学建模模型总结
这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!
ET2012新版免狗免安装绿色软件
ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,
线程池工具类-代理-callable-execute
工具类: package common; import java.util.concurrent.Callable; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.LinkedBlockingQueue; import java.uti...
SIMATIC S7-1200, S7-1500 PID 控制[手册]
SIMATIC S7-1200, S7-1500 PID 控制[手册]
java线程池的简单实现
最近为了加强对现
以前写的一个线程管理器--ThreadManager
windows下适当的使用多线程能增加程序运行效率,不过winapi自带的线程接口函数直接调用多了可能会有点乱,所以我对其进行了2次封装,增加了oo特性。 编译后生成ThreadManager.lib,ThreadManager.dll以供调用。 ThreadManager.h [code="c++"] #pragma once #include #include #in...
项目中使用到的线程池.
package com.megvii.livecheck.common; import android.util.Log; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadFactory; import java.util.c
Android线程池管理类TheadManager
线程池管理类代码如下: import java.util.HashMap; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurren...
Android通用C++线程池
一、背景意义 项目中可能需要处理一些比较繁琐的事,而这些事正好可以使用线程来解决,如tv上经常会去dump raw data,若直接在解码线程中dump raw data会导致每一帧的处理时间变长,如果大幅超出33ms,就会出现丢帧情况,而对于h264格式数据来说,丢帧会导致马赛克产生。下面列出线程池的一种实现(部分功能可以再完善下,比如添加job的优先级,然后根据该优先级顺序来处理job......),此文件导入到项目中就可以使用。 二、具体实现 ThreadCore...
线程池管理类
/** * 线程管理器 * */ public class ThreadManager { private static ThreadPool mThreadPool; public static ThreadPool getThreadPool() { if (mThreadPool == null) { synchronized (Th
高通CamX框架线程管理核心:ThreadManager原理与调优实战
在复杂的多媒体与相机系统中,线程管理是保障高并发、低延迟任务稳定运行的关键技术。对于基于高通平台的Camera HAL开发而言,理解CamX框架中的ThreadManager机制,是掌握相机管线调度的基础。ThreadManager不仅提供线程池能力,更通过任务切分、跨Node协同和资源可控等核心设计,解决了多Pipeline并行时的阻塞与性能问题。特别是在高通AI ISP和NPU架构协同的场景下,合理的线程优先级、CPU亲核性配置以及Job投递策略,直接影响AI降噪、人脸检测等特性的帧率与功耗表现。本文从
704



被折叠的 条评论
为什么被折叠?



