LiteGo:「迷你」的Android异步并发类库
LiteGo是一款基于Java语言的「异步并发类库」,它的核心是一枚「迷你」并发器,它可以自由地设置同一时段的最大「并发」数量,等待「排队」线程数量,还可以设置「排队策略」和「超载策略」。 LiteGo可以直接投入Runnable、Callable、FutureTask 等类型的实现来运行一个任务,它的核心组件是「SmartExecutor」,它可以用来作为「App」内支持异步并发的唯一组件。 在一个App中「SmartExecutor」可以有多个实例,每个实例都有完全的「独立性」,比如独立的「核心并发」、「排队等待」指标,独立的「运行调度和满载处理」策略,但所有实例「共享一个线程池」。 这种机制既满足不同模块对线程控制和任务调度的独立需求,又共享一个池资源来节省开销,最大程度上节约资源复用线程,帮助提升性能。
LiteGo 背景
关于异步、并发的现状和问题
线程的创建代价比较大,尤其在短时间需要大量并发的场景下问题突出,所以Java有了线程池来管理和复用线程。
一般来讲,一个App一个线程池足矣!也不需要自己完全重新实现,充分利用Doug Lea(对java贡献最大的个人)主写的concurrent库。
现在框架众多,有的独立精悍,也有集大成者,建议阅读源码,最好知根知底,很可能在他们有自己的线程池,这个时候如果你不注意管理线程那就雪上加霜咯。
所以,鉴于此我写了这个类库,来统一线程池,明确和控制管理策略。
LiteGo 理念
清闲时线程不要多持,最好不要超过CPU数量,根据具体应用类型和场景来决策。
瞬间并发不要过多,最好保持在CPU数量左右,或者可以多几个问题并不大。
注意控制排队和满载策略,大量并发瞬间起来的场景下也能轻松应对。
同时并发的线程数量不要过多,最好保持在CPU核数左右,过多了CPU时间片过多的轮转分配造成吞吐量降低,过少了不能充分利用CPU,并发数可以适当比CPU核数多一点没问题。
还有个小小的个人建议,业务上合理调度任务,优化业务逻辑,从自己做起,不胡搞乱搞咯。
LiteGo 特性
可定义核心并发线程数,即同一时间并发的请求数量。
可定义等待排队线程数,即超出核心并发数后可排队请求数量。
可定义等待队列进入执行状态的策略:先来先执行,后来先执行。
可定义等待队列满载后处理新请求的策略:
抛弃队列中最新的任务
抛弃队列中最旧的任务
抛弃当前新任务
直接执行(阻塞当前线程)
抛出异常(中断当前线程)
LiteGo 使用
初始化:
// 智能并发调度控制器:设置[最大并发数],和[等待队列]大小 SmartExecutor smallExecutor = new SmartExecutor(); // set temporary parameter just for test // 一下参数设置仅用来测试,具体设置看实际情况。 // number of concurrent threads at the same time, recommended core size is CPU count // 开发者均衡性能和业务场景,自己调整同一时段的最大并发数量smallExecutor.setCoreSize(2); // adjust maximum number of waiting queue size by yourself or based on phone performance // 开发者均衡性能和业务场景,自己调整最大排队线程数量 smallExecutor.setQueueSize(2); // 任务数量超出[最大并发数]后,自动进入[等待队列],等待当前执行任务完成后按策略进入执行状态:后进先执行。 smallExecutor.setSchedulePolicy(SchedulePolicy.LastInFirstRun); // 后续添加新任务数量超出[等待队列]大小时,执行过载策略:抛弃队列内最旧任务。 smallExecutor.setOverloadPolicy(OverloadPolicy.DiscardOldTaskInQueue);
上述代码设计了一个可同时并发「2」个线程,并发满载后等待队列可容纳「2」个线程排队,排队队列中后进的任务先执行,等待队列装满后新任务来到将抛弃队列中最老的任务。
测试多个线程并发的情况:
// 一次投入 4 个任务for (int i = 0; i < 4; i++) { final int j = i; smallExecutor.execute(new Runnable() { @Override public void run() { HttpLog.i(TAG, " TASK " + j + " is running now ----------->"); SystemClock.sleep(j * 200); } }); }// 再投入1个可能需要取消的任务 Future future = smallExecutor.submit(new Runnable() { @Override public void run() { HttpLog.i(TAG, " TASK 4 will be canceled... ------------>"); SystemClock.sleep(1000); } }); // 合适的时机取消此任务 future.cancel(false);
上述代码,一次依次投入 0、1、2、3、4 五个任务,注意4任务是最后投入的,返回一个Future对象。
根据设置,0、1会立即执行,执行满载后2、3进入排队队列,排队满载后独立投入的任务4来到,队列中最老的任务2被移除,队列中为3、4 。
因为4随后被取消执行,所以最后输出:
TASK 0 is running now -----------> TASK 1 is running now -----------> TASK 3 is running now ----------->
LiteGo:「迷你」的Android异步并发类库 LiteGo是一款基于Java语言的「异步并发类库」,它的核心是一枚「迷你」并发器,它可以自由地设置同一时段的最大「并发」数量,等待「排队」线程数量,还可以设置「排队策略」和「超载策略」。 LiteGo可以直接投入Runnable、Callable、FutureTask 等类型的实现来运行一个任务,它的核心组件是「SmartExecutor」,它
我们都知道,谷歌有一个开源库叫做TensorFlow,可被用在安卓系统中实现机器学习。换言之,TensorFlow是谷歌为机器智能提供的一个开源软件库。 TensorFlow: 1.模型计算,训练模型 2.推理 主要作用: 当我们有一个已经训练好的TF模型的时候,我们怎么去调用这个模型并且让他顺利在Android平台上运行起来呢? 大概包括这几个方面: 1、 保存训练完毕的TF模
TensorFlow Lite Object Detection Android Demo Overview NOTE: This project was originally taken (and modified) from the official TensorFlow examples repository at https://github.com/tensorflow/examples
ProtoBuf-gRPC-Android 教你如何使用ProtoBuf,通过gRPC服务在android上进行网络请求。 如果你对此感兴趣,那么请点击项目地址,一睹为快把! 简介 ProtoBuf google公司发布的一套开源编码规则,基于二进制流的序列化传输,可以转换成多种编程语言,几乎涵盖了市面上所有的主流编程语言,是目前公认的非常高效的序列化技术。 ProtoBuf的Github主页:g
Android Web Editor Lite Android Web Editor Lite - a unique mobile software for web developing. Best Web Editor on Android. Comming Soon: - SSH/SFPT support - FTP multiserver support - Recent files - R
Intent(二)隐式调用intent 在上一节我们一起学习了显示调用Intent,这一节我们来学习如何隐式调用Ingtent.有了这个我们就可以调用其他的线程,或者程序,可以让我们的应用程序变得多彩,如打开网页,拨打电话等. 接下来让我们 ... ios开发——实用技术篇Swift篇&;多点触摸与手势识别 多点触摸与手势识别 //点击事件 var atap =
In this tutorial, we will learn how to make a custom object detection model in TensorFlow and then converting the model to tflite for android. I will go through step by step. Every step is important s
Patches to Go to enable Android apps written in Go 让使用Google的Golang语言开发Android应用,成为现实。 仅支持ARMv7及其之后的CPU,貌似市面上也看不到之前的CPU了。
本文向大家介绍python并发和异步编程实例,包括了python并发和异步编程实例的使用技巧和注意事项,需要的朋友参考一下 关于并发、并行、同步阻塞、异步非阻塞、线程、进程、协程等这些概念,单纯通过文字恐怕很难有比较深刻的理解,本文就通过代码一步步实现这些并发和异步编程,并进行比较。解释器方面本文选择python3,毕竟python3才是python的未来,并且python3用原生的库实现协程已经
同步(Synchronization) 线程间的通信主要是通过共享访问字段以及其字段所引用的对象来实现的。这种形式的通信是非常有效的,但可能导致2种可能的错误:线程干扰(thread interference)和内存一致性错误(memory consistency errors)。同步就是要需要避免这些错误的工具。 但是,同步可以引入线程竞争(thread contention),当两个或多个线程
Android下的Nosql数据库,自带与服务器端Nosql进行数据同步的功能,与CouchDb类似,是Android下开发企业应用非常好的工具。 笔者之前做的企业erp——快销通,就需要手机与服务器的数据同步,Sybase有这样的组件,价格高,而且还不再升级维护。自己做数据同步,可靠性、并发性开发周期太长,这些工具组件可以很好的帮助开发者完成工作。
本文向大家介绍Android中异步类AsyncTask用法总结,包括了Android中异步类AsyncTask用法总结的使用技巧和注意事项,需要的朋友参考一下 本文总结分析了Android中异步类AsyncTask用法。分享给大家供大家参考,具体如下: 最近整理笔记的时候,看到有关AsyncTask不是很理解,重新疏导了一下,有在网上找了一些资料,个人不敢独享,一并发在这里与大家共勉 这里有两种解
问题内容: 假设我有某种游戏。我有一个buyItem函数,如下所示: 如果我对该路由进行垃圾邮件处理,直到扣除用户余额(第二次查询),则用户余额仍为正。 我尝试过的 问题是将在第一〜5项要求。因此,这也不起作用。 我们如何处理这种情况?如果重要的话,我正在使用Sails.JS框架。 问题答案: 通过该方法,Sails 1.0现在具有完整的事务支持。例: 更新资料 正如一些评论者所指出的,启用连接池