ThreadPool&AsyncTask

ROS2实战:打造智能巡检机器人的关键技术与实现 本文详细介绍了基于ROS2和Navigation2构建智能巡检机器人的完整实战流程。通过设计主从协作的事件驱动架构,实现了机器人在已知地图中的自动导航、定点语音播报和环境图像采集功能。文章涵盖了从环境搭建、仿真配置到核心控制节点、语音服务与图像记录模块的代码实现,为开发者打造实用的自动巡检机器人提供了清晰的技术指南。 阅读详情
ThreadPool&AsyncTask

ThreadPool线程池

  • new Thread的弊端如下:
    a. 每次new Thread新建对象性能差。
    b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。
    c. 缺乏更多功能,如定时执行、定期执行、线程中断。
  • 相比new Thread,Java提供的四种线程池的好处在于:
    a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。
    b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
    c. 提供定时执行、定期执行、单线程、并发数控制等功能。
  • 线程池的创建:
    1、new ThreadPoolExecutor的方式
    ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, workQuene, threadFactory, handler);
//              corePoolSize 核心线程数
//              maximumPoolSize 最大线程数
//              keepAliveTime 超过核心线程数后创建的线程存活时间
//              unit 时间单位
//              workQuene 工作队列
//              threadFactory 默认线程对象
//              handler 异常处理对象

**形象解释:**ThreadPoolExecutor中额定的“工人”数量由corePoolSize决定,当任务数量超过额定工人数量时,将任务缓存在BlockingQueue之中,当发现如果连queue中也放不下时(可能是因为使用有界queue,也可能是使用SynchronousQueue),ThreadPoolExecutor会请求“老板”再派几个“工人”过来。

假设后来向老板派来的工人始终是“借来的”,俗话说“有借就有还”,但这里的问题就是什么时候还了,如果借来的工人刚完成一个任务就还回去,后来发现任务还有,那岂不是又要去借?这一来一往,老板肯定头也大死了。

合理的策略:既然借了,那就多借一会儿。直到“某一段”时间后,发现再也用不到这些工人时,便可以还回去了。这里的某一段时间便是keepAliveTime的含义,TimeUnit为keepAliveTime值的度量。

2、通过Executors提供的四种线程池

  • newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
    示例代码如下:
//线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
    final int index = i;
    try {
        Thread.sleep(index * 1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    cachedThreadPool.execute(new Runnable() {

        @Override
        public void run() {
            System.out.println(index);
        }
    });
}

  • newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
//因为线程池大小为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字。
//定长线程池的大小最好根据系统资源进行设置。如//Runtime.getRuntime().availableProcessors()。可参考PreloadDataCache。
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
    final int index = i;
    fixedThreadPool.execute(new Runnable() {

        @Override
        public void run() {
            try {
                System.out.println(index);
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });
}

  • newScheduledThreadPool创建一个定长线程池,支持定时及周期性任务执行。
//表示延迟3秒执行。
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
scheduledThreadPool.schedule(new Runnable() {

    @Override
    public void run() {
        System.out.println("delay 3 seconds");
    }
}, 3, TimeUnit.SECONDS);

//定期执行示例 表示延迟1秒后每3秒执行一次。
//ScheduledExecutorService比Timer更安全,功能更强大,后面会有一篇单独进行对比。
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {

    @Override
    public void run() {
        System.out.println("delay 1 seconds, and excute every 3 seconds");
    }
}, 1, 3, TimeUnit.SECONDS);

  • newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
//结果依次输出,相当于顺序执行各个任务。
//现行大多数GUI程序都是单线程的。Android中单线程可用于数据库操作,文件操作,应用批量安装,应用批量删除等不适合并发但可能IO阻塞性及影响UI线程响应的操作。
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
    final int index = i;
    singleThreadExecutor.execute(new Runnable() {

        @Override
        public void run() {
            try {
                System.out.println(index);
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });
}

自封装ThreadManager举例:

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

public class ThreadManager {
    private static Object obj = new Object();

    private static ThreadPoolProxy threadPoolProxy;

    public static ThreadPoolProxy getThreadPoolProxy() {
        synchronized (obj) {
            if (threadPoolProxy == null) {
                threadPoolProxy = new ThreadPoolProxy(1, 2, 100);
            }
            return threadPoolProxy;
        }
    }

    public static class ThreadPoolProxy {
        private int corePoolSize;
        private int maximumPoolSize;
        private long keepAliveTime;

        public ThreadPoolProxy(int corePoolSize, int maximumPoolSize, long keepAliveTime) {
            this.corePoolSize = corePoolSize;
            this.maximumPoolSize = maximumPoolSize;
            this.keepAliveTime = keepAliveTime;
        }

        public void excute(Runnable runnable) {
            if (runnable != null) {

                ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,
                        keepAliveTime, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(),
                        Executors.defaultThreadFactory(), new AbortPolicy());

                threadPoolExecutor.execute(runnable);
            }
        }

        public static void main(String[] args) {
            ThreadManager.getThreadPoolProxy().excute(new Runnable() {
                public void run() {
                    while (true) {
                        System.out.println("----------");
                    }
                }
            });

        }
    }

}

AsyncTask<Params,Progress,Result>
step1:继承AsyncTask

       Params:输入参数。对应的是调用自定义的AsyncTask的类中调用excute()方法中传递的参数。如果不需要传递参数,则直接设为Void即可。

       Progress:子线程执行的百分比

       Result:返回值类型。和doInBackground()方法的返回值类型保持一致。

step2:实现以下几个方法:执行时机和作用看示例代码,以下对返回值类型和参数进行说明

      onPreExecute():无返回值类型。不传参数

      doInBackground(Params... params):返回值类型和Result保持一致。参数:若无就传递Void;若有,就可用Params

      publishProgress(Params... params):在执行此方法的时候会直接调用onProgressUpdate(Params... values)

      onProgressUpdate(Params... values):无返回值类型。参数:若无就传递Void;若有,就可用Progress

      onPostExecute(Result  result) :无返回值类型。参数:和Result保持一致。

step3:在调用自定义的AsyncTask类中生成对象;

      执行  :对象.excute(Params... params);

注意:

   1) Task的实例必须在UI thread中创建
   2) execute方法必须在UI thread中调用
   3) 不要手动的调用onPreExecute、onPostExecute doInBackground、 onProgressUpdate这几个方法
   4) 该task只能被执行一次,否则多次调用时将会出现异常

AsyncTask本质还是调用的ThreadPool,分同步SERIAL_EXECUTOR和异步THREAD_POOL_EXECUTOR两种方式
asynct.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, 0);
asynct.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, 0);

AsyncTask只是封装了线程池、封装了UIThread与子Thread的通讯

Python开发者必看:5分钟搞定Gemini API的3种调用方式(含代码示例) 本文为Python开发者详细介绍了三种高效调用Gemini API的核心方式:基础同步调用、流式调用和聊天模式,并涵盖多模态应用等高级特性。通过清晰的代码示例和实战场景分析,帮助开发者快速掌握Gemini API的集成与优化,提升AI应用开发效率。 阅读详情

相关推荐

从零构建智能监控系统:ZLMediaKit与SpringBoot的RTSP流处理实战

本文详细介绍了如何从零构建智能监控系统,结合ZLMediaKit与SpringBoot实现RTSP流处理。通过多协议支持、高性能架构设计及工业级部署优化,解决传统监控方案的兼容性差、延迟高等问题,适用于物联网和智能安防领域。

weixin_29002209的博客 370

java spring线程池详解_Spring Boot利用@Async异步调用:ThreadPoolTaskScheduler线程池的优雅关闭详解...

前言之前分享了一篇关于Spring Boot中使用@Async来实现异步任务和线程池控制的文章:《Spring Boot使用@Async实现异步调用:自定义线程池》。由于最近身边也发现了不少异步任务没有正确处理而导致的不少问题,所以在本文就接前面内容,继续说说线程池的优雅关闭,主要针对ThreadPoolTaskScheduler线程池。问题现象在上篇文章的例子Chapter4-1-3中,我们定义...

weixin_42518090的博客 496

从零到一:Qt与PCL的跨平台开发环境搭建全攻略

本文详细介绍了从零开始搭建Qt与PCL跨平台开发环境的完整流程,涵盖Windows、Linux和macOS三大平台。重点解析了Qt5与Qt6版本选择、PCL库安装配置、VTK集成等关键技术要点,并提供跨平台CMake项目模板和常见问题解决方案,助力开发者快速构建三维点云处理应用。

weixin_29280657的博客 384

ThreadManager 一个简易的线程池管理类,提供三个线程池

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....

Qw的博客 2026

重访时间与覆盖分析的stk操作

1.打开stk 2.创建一个新的场景,命名为Test,选择地球为场景星球,若为金星,可在Central Body里选择Venus(金星自转周期慢,自转周期243天,卫星轨道变化不明显)(其中start stop时间可设置长一些) 3.插入一个AreaTarget或者place,以AreaTarget为例 选择Pattern,Add三个点(用法可见前面的博客,有时候编程的代码也可以帮助理解stk的操作) 4.插入Satellite,选择Orbit Wizard(若想设置卫星的六根数也可

weixin_42664107的博客 1万+

安卓APP通过CH340实现USB串口通信与设备检测

本文详细介绍了安卓APP通过CH340芯片实现USB串口通信与设备检测的完整流程。从CH340芯片的基础原理到开发环境搭建,再到串口通信的具体实现和错误处理,提供了全面的技术指导。文章还分享了USB热插拔处理、自动重连策略以及性能优化等实战技巧,帮助开发者高效完成安卓与嵌入式设备的通信开发。

weixin_42531925的博客 381

Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比

在加载大量数据的时候,经常会用到异步加载,所谓异步加载,就是把耗时的工作放到子线程里执行,当数据加载完毕的时候再到主线程进行UI刷新。在数据量非常大的情况下,我们通常会使用两种技术来进行异步加载,一是通过AsyncTask来实现,另一种方式则是通过ThreadPool来实现,今天我们就通过一个例子来讲解和对比这两种实现方式。 本文原创,如需转载,请注明转载地址http://blog.csdn.n

低头走路 1万+

23、电生理与CSD分析:探索大脑活动的前沿技术

本文介绍了电生理与电流源密度(CSD)分析在探索大脑活动中的前沿应用。从电生理技术的发展现状,到局部场电位(LFPs)的起源与解释,重点阐述了CSD分析的原理、实验方法及其在绘制皮层兴奋流、解析突触输入和研究自发振荡中的广泛应用。文章还总结了该领域的优势与挑战,并展望了技术改进、多模态融合、数据分析创新及临床拓展的未来方向,展示了这些技术在揭示大脑功能机制中的关键作用。

Apple的专栏 123

AsyncTask线程池

Android首次引入这个类的时候,异步任务是在单个后台线程上串行执行的,不能并行地执行;在Android1.6开始,AsyncTask引入了线程池,允许多任务并发执行,最大并发数为5,同一时刻最多有5个任务执行,其他任务只能等待,线程池大小为128,如果超过128个任务时,有可能程序崩溃。 在Android 3.0中改正了这个缺陷,采用了2个线程池:一个单线程的线程池SERIAL_EXECUT...

罗锋的博客 1889

【33】软考软件设计师——算法题(二):贪心法与回溯法深度精讲|第4题进阶满分攻略

本文是《软件设计师·50讲通关|从零基础到工程师职称》专栏第33篇,承接第32篇分治法与动态规划,聚焦**下午第4题算法大题进阶核心**,详解贪心法与回溯法两大高频难点算法。全文超4000字深度拆解贪心法核心原理、贪心选择性质、局部最优推全局最优的底层逻辑,厘清贪心算法适用边界与经典误区;深挖回溯法深度优先遍历思想、递归回溯三步流程、可行性剪枝与最优性剪枝两大核心技巧;全覆盖活动选择、零钱兑换、01背包贪心禁区、八皇后、全排列等软考必考经典题型;配套标准化算法框架代码、考场填空模板、剪枝优化实操案例

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 441

基于STM32设计的智能家居系统(采用ESP8266+OneNet云平台)

一、环境介绍 单片机采用:STM32F103C8T6 上网方式:采用ESP8266,也可以使用其他设备代替,只要支持TCP协议即可。比如:GSM模块、有线网卡等。 云平台: 采用中国移动OneNet. 也可以采用腾讯、阿里云、华为云、百度天工物接入、机智云等等。 前面文章有讲解。 协议: 采用MQTT协议 开发软件:keil5 完整项目源码下载:https://download.youkuaiyun.com/download/xiaolong1126626497/19766925 二、包含的硬件与实...

1万+

Android AsyncTask两种线程池分析和总结

转自:http://bbs.51cto.com/thread-1114378-1-1.html Android AsyncTask两种线程池分析和总结 (一)    前言 在android AsyncTask里面有两种线程池供我们调用 1.    THREAD_POOL_EXECUTOR, 异步线程池 2.    SERIAL_EXECUTOR,同步线程池 正如上面名称描述的那

aoshiwenrou的专栏 934

YOLOv11-seg改进系列 | 引入CMTFNet(TGRS2023)+TransNeXt(CVPR2024)的C3k2_MSMHSA_CGLU模块,多尺度空洞注意力扩大感受野,增强复杂背景下

本文提出一种改进YOLOv11分割模型的C3k2_MSMHSA_CGLU模块,融合多尺度多头自注意力(MSMHSA)和卷积门控线性单元(CGLU)。MSMHSA通过多尺度空洞卷积提取不同感受野特征,生成跨尺度注意力,降低计算量同时保留全局上下文。CGLU采用卷积门控机制增强特征变换能力。实验表明,改进后模型参数量仅增加7.8%,GFLOPs增加4.2%,显著提升了多尺度目标检测性能,尤其适用于遥感图像等复杂场景。该模块有效解决了原始C3k2感受野有限、缺乏全局建模能力的问题。

qq_44224801的博客 201

AsyncTask 串行SERIAL_EXECUTOR,并行THREAD_POOL_EXECUTOR分析

AsyncTaks的内部实现机制相信已经很多人了解过了,但是多次调用excute()后,它是怎么执行的?带着这个疑问,来实践下看看 public class TestActivity extends AppCompatActivity { private static int ID = 0; private static final int TASK_COUNT = 20; ...

qq_37704124的博客 911

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Android开发(5):多线程之AsyncTask

一、AsyncTask介绍 上一篇博客介绍了多线程handle的使用,但是handle需要通过post或sendMessage来使用handle通知主线程来更新UI,我们需要完成子线程和handle的内部实现,而AsyncTask封装了所有,我们只需要继承AsyncTask类,在类里面根据自己的需求重写相对应函数,需要在主线程执行的函数也在类里面重写,不需要我们重新在类外写函数接受信息,比起“Th...

chenxz_的博客 535

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

AsyncTask里的线程池串行、并行逻辑详解。

AsyncTask里面封装了线程池和Handler,所以很是方便我们使用它来处理ui线程和工作线程之间的异步任务的逻辑工作。 AsyncTask里面的的线程池的实现是用ThreadPoolExecutor来实现的。然而ThreadPoolExecutor的的执行逻辑在cpu多核情况下,执行顺序是不确定的,也就是并行的。 AsyncTask里面有两个线程池的静态常量 这就保证了整个逻辑内只有一个...

challenge51all的专栏 1390

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Android AsyncTask 详解

将复杂工作异步化、线程化对于Android 的性能的提高起到了很重要的作用,Android 框架为开发提供了很多辅助程序,这一篇着重分析Android AsyncTask的原理。

私房菜 6812

AsyncTask 的两个线程池原理探究

熟悉AsyncTask的人都知道,AsyncTask中维护了两个线程池 //第一个线程池,用作执行具体任务 public static final Executor THREAD_POOL_EXECUTOR; static { ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(...

楠枫的博客 740

ThreadPoolTaskExecutor线程池管理(解决@Async问题)

ThreadPoolTaskExecutor是Spring框架提供的线程池管理器,它继承自ThreadPoolExecutor类,并对其进行了一些扩展和封装,并解决@Async问题

灵感君 1135

AsyncTask详解

作为Android中最常用的

a220315410的专栏 2591

Android实战技巧:深入解析AsyncTask

AsyncTask的介绍及基本使用方法 关于AsyncTask的介绍和基本使用方法可以参考官方文档和Android实战技巧:多线程AsyncTask这里就不重复。 AsyncTask引发的一个问题 上周遇到了一个极其诡异的问题,一个小功能从网络上下载一个图片,然后放到ImageView中,是用AsyncTask来实现的,本身逻辑也很简单,仅是在doInBackground中用HTTP请求把图

稀有猿诉 10万+

java async task_java 线程池ThreadPoolExecutor 如何与 AsyncTask() 组合使用。

转载请声明出处谢谢!http://www.cnblogs.com/linguanh/这里主要使用Executors中的4种静态创建线程池实例方法中的 newFixedThreadPool()来举例讲解。简单说下Executors类,提供的一系列创建线程池的方法:他们都有两个构造方法1. --------newFixedThreadPool(创建一个定长线程池,可控制线程最大并发数,超出的线程会在队...

weixin_39855658的博客 419

android:线程池和AsyncTask使用小结

AsyncTask3.1之前: 2.3系统同时execute执行10个异步任务 2.3到3.1版本之前的系统默认最大并发执行5个线程,缓冲线程队列最大128个。虽然开了10个异步任务, 但是只能同时并发执行5个,其他的任务都得等前面5个执行完后才继续执行,接着也是5次并发执行。 3.1版本之后 默认是使用SERIAL_EXECUTOR串行任务执行,可以预料到异步任务将会是一个个顺序执行一个个线程按加

黄孝果的博客 7369

AsyncTask学习记录

AsyncTask学习记录

rinasguo的博客 397

AsyncTask原理及不足

一 为什么需要工作者线程 Android应用的主线程(UI线程)肩负着绘制用户界面和及时响应用户操作的重任,为了避免”ANR”,就要确保主线程时刻保持较高的响应性.为了做到这一点,我们就要把耗时的任务移出主线程,那么耗时的任务交给谁来完成呢?答案就是工作者线程。Android开发中我们通常让主线程负责前台用户界面的绘制以及响应用户的操作,让工作者线程在后台执行一些比较耗时的任务。Android中的工作者线程主要有AsyncTask、IntentService、HandlerThread,它们本质上都是对线

qq_39431405的博客 639

ThreadPoolManager

public void checkIPAuth(String iccid,String ipAddress) { AsyncIPAuth as = new AsyncIPAuth(iccid,ipAddress); boolean isSucceed = false; ThreadPoolManager poolManager = ThreadPoolManager.getInstan

人生最遗憾的莫过于:轻易地放弃了不该放弃的,固执地坚持了不该坚持的 2162
上一篇: 自己实现个Android下仿IOS的时间选择器、时间控件Time-Selector
SetO2
博客等级 码龄12年 5粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值