背景

大家都知道在我们的开发中永远都离不开多线程,对于我们为什么要使用多线程,多线程的使用和多线程的一些基础知识这里我们就不讲了,有兴趣的朋友可以去看一下博主之前的几篇文章:
线程你真的了解它吗
这才是真正的多线程
Android线程池的使用
那么为什么还要写这一篇文章呢,因为博主在开发的过程中也经常遇不同项目,然后每次都要来回复制代码,配置不同参数觉得很麻烦,这里就进行了一个封装,最后直接打包发布,下次使用直接用gradle导入就OK了。这个框架也是从工作中的代码抽取出来的,有好多人的代码和逻辑贡献。
代码和使用方法最后都开源到了Github有兴趣的朋友可以查看:GeekThread

具体功能

尽然是封装了一个通用性的线程池框架,那么就一定要有它的通用性,安全性,全面性,所以大致的设计如下:
1、按照线程类型来区分线程池,避免线程之间相互影响和占用(后面发现这种形式虽然可以互不干扰,但是多个线程池占用了更多资源和内存,而且有一定的资源浪费,所以不可取)。
2、按照线程优先级来对同一线程池中的线程进行执行优先级的区分。
3、线程池创建增加同步锁,避免同时出现多个。
4、保存每一个正在执行的线程,方便使用者取消和移除对应的工作线程。
5、通过计算cup等设备信息来配置最大线程池数,最大线程数等信息。
6、封装入口方法,保护源码的安全性和完整性。
7、利用工厂等设计模式来提升代码的可读性和清晰性。

主要实现代码

ThreadPriority p = null;
if (r instanceof GeekPriorityComparable) {
p = ((GeekPriorityComparable) r).getGeekPriority();
}
if (null != p) {
switch (p) {
case REAL:
Process.setThreadPriority(Process.myTid(), 0);
break;
case HIGH:
Process.setThreadPriority(Process.myTid(), 5);
break;
case NORMAL:
Process.setThreadPriority(Process.myTid(), 10);
break;
case LOW:
Process.setThreadPriority(Process.myTid(), 15);
break;
case BACKG:
Process.setThreadPriority(Process.myTid(), 20);
break;
default:
Process.setThreadPriority(Process.myTid(), 10);
break;
}
}

上面代码是通过设置的线程等级来设置优先级。

public class GeekThreadPools {

    public static int executeWithGeekThreadPool(Runnable runnable){
return executeWithGeekThreadPool(runnable,ThreadType.NORMAL_THREAD,ThreadPriority.NORMAL);
} /**
* 使用线程池执行Runnable
* @param runnable 需要执行的Runnable
* @param threadType Runnable 的任务类型 任务类型参考 {@link ThreadType}
* @param threadPriority Runnable 的优先级 优先级参考 {@link ThreadPriority}
* @return 当前Runnable的key,key可以用来取消当前还未执行的任务
*/
public static int executeWithGeekThreadPool(final Runnable runnable, ThreadType threadType, ThreadPriority threadPriority){
if(null == runnable ){
return -1;
}
if(null == threadType){
threadType = ThreadType.NORMAL_THREAD;
}
if(null == threadPriority){
threadPriority = ThreadPriority.NORMAL;
}
GeekTask<Void> t = new GeekTask<>(runnable, null, threadPriority); return GeekThreadManager.getInstance().submitCancelable(t,threadType);
}
}

上面是其中一个线程池的管理类,大家可以通过它暴露的方法来执行多线程操作。

使用方法

compile 'com.geek.thread:thread-pool:1.0.1'

详细的可以参考GitHub项目说明GeekThread

总结

好了以上就是这次要给大家分享的Android线程池框架,大家有什么问题可以给我发简书或者加入楼主的技术QQ群:557381815,我会在第一时间给大家解答,喜欢的朋友欢迎点赞或打赏,给楼主动力,谢谢大家。

作者:Only凹凸曼
链接:https://www.jianshu.com/p/a880393c3b53
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

最强大的Android线程池框架的更多相关文章

  1. Java 线程池框架核心代码分析--转

    原文地址:http://www.codeceo.com/article/java-thread-pool-kernal.html 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和 ...

  2. 【JUC】JUC线程池框架综述

    一.前言 在分析完了JUC的锁和集合框架后,下面进入JUC线程池框架的分析,下面给出JUC线程池的总体框架,之后再逐一进行分析. 二.JUC线程池框架图 说明:从上图可知,JUC线程池框架中的其他接口 ...

  3. 一个简单的python线程池框架

    初学python,实现了一个简单的线程池框架,线程池中除Wokers(工作线程)外,还单独创建了一个日志线程,用于日志的输出.线程间采用Queue方式进行通信. 代码如下:(不足之处,还请高手指正) ...

  4. Android(java)学习笔记267:Android线程池形态

    1. 线程池简介  多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.     假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...

  5. Java 线程池框架核心代码分析

    前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和资源消耗都是很高的.线程池应运而生,成为我们管理线程的利器.Java 通过Executor接口,提供了一种标准的方法将任务的提交过 ...

  6. android线程池ThreadPoolExecutor的理解

    android线程池ThreadPoolExecutor的理解 线程池 我自己理解看来.线程池顾名思义就是一个容器的意思,容纳的就是ThreadorRunable, 注意:每一个线程都是需要CPU分配 ...

  7. android 线程池的使用

    转自http://www.trinea.cn/android/java-android-thread-pool/ Java(Android)线程池 介绍new Thread的弊端及Java四种线程池的 ...

  8. Android(java)学习笔记211:Android线程池形态

    1. 线程池简介  多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.     假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...

  9. Executor线程池框架

    Executor线程池框架 new Thread()的缺点 每次new Thread()耗费性能 调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制创建,之间相互竞争,会导致 ...

随机推荐

  1. Java+Maven的工程运行Sonar的方式

    step 1:在maven->setting.xml中进行配置 修改mvn工程所用的setting.xml文件,在<profiles></profiles>节点中增加: ...

  2. QT | 第二章 基本语法

    ''' @Modify Time @Author ------------ ------- python基本语法 2019/10/26 8:16 laoalo ''' import functools ...

  3. 测开之路六十一:接口测试平台之interface蓝图

    create的js //添加header的函数function add_header() { // 这里是动态拼接html语句,带着样式,拼凑成页面的 "key [] value []&qu ...

  4. 【转载】Spring Boot:常用属性汇总

    附录A.常用应用程序属性 摘自:https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-pr ...

  5. CentOS修改网络设置,不容易啊,终于可以在virtualbox里上网了

    CentOS 修改网关 修改对应网卡的网关的配置文件[root@centos]# vi /etc/sysconfig/network修改以下内容NETWORKING=yes(表示系统是否使用网络,一般 ...

  6. vue双花括号的使用

    <!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. 28. Jmeter函数

    Jmeter函数传送门 软件测试汪简书地址 软件测试汪博客地址 欢迎关注微信公众号:软件测试汪.软件测试交流群:809111560 转载请注意出处,谢谢合作

  8. MySQL-- 数据库的三范式

    目前关系数据库有六种范式:第一范式(1NF).第二范式(2NF).第三范式(3NF).巴斯-科德范式(BCNF).第四范式(4NF)和第五范式(5NF,又称完美范式). 而通常我们用的最多的就是第一范 ...

  9. Learning OSG programing---osgAnimation(2)

    osg::Node* createBase(const osg::Vec3& center,float radius) { ; ; *radius; *radius; osg::Vec3 v0 ...

  10. [Linux] 015 用户管理命令

    1. 用户管理命令:useradd 命令名称:useradd 命令所在路径:/bin/sbin/useradd 执行权限:root 语法:useradd 用户名 功能描述:添加新用户 范例: $use ...