背景

大家都知道在我们的开发中永远都离不开多线程,对于我们为什么要使用多线程,多线程的使用和多线程的一些基础知识这里我们就不讲了,有兴趣的朋友可以去看一下博主之前的几篇文章:
线程你真的了解它吗
这才是真正的多线程
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. Linux根据进程号查找其程序文件路径 及 lsof 命令使用

    查找进程文件路径 lsof -p pid 1.列出所有打开的文件: lsof 备注: 如果不加任何参数,就会打开所有被打开的文件,建议加上一下参数来具体定位 2. 查看谁正在使用某个文件 lsof   ...

  2. C# 与 C++,语法差别有多小-其他2

    1. 内存分配 C++:指针在堆区(new),定义在栈区 C#:  对象在堆区,值在栈区.不允许不通过new在构造对象 2.变量 C++: char 1个字节 ascii C#:   char 2个字 ...

  3. 「THUPC 2017」机场 / Airport

    https://loj.ac/problem/2403 题解 神仙题. 练习赛的时候想了个假建图. 正解太神仙了. 先把不合法情况判掉. 先对时间离散化,每个时间点开一个点. 然后把他们一次串起来,中 ...

  4. bzoj1964: hull 三维凸包

    传送门 二维平面四个点求凸包面积->任选三个点面积之和/2 三维平面五个点求凸包体积->任选四个点体积之和/2 二维平面三个点面积->二个二维向量行列式值的绝对值/2 三维平面四个点 ...

  5. 彻底关闭Postprocess

    即使场景中没有postprocess volume,场景中也会有默认的postprocess volume效果,如果需要彻底关闭postprocess, 可以使用命令: sg.PostProcessQ ...

  6. HDU6424 Rikka with Time Complexity

    HDU6424 Rikka with Time Complexity 数学题~(真的数学题) #include <bits/stdc++.h> #define mp(_,__) make_ ...

  7. php函数名后冒号+数据类型(返回值类型限制/php新特性)

    在PHP7,一个新的功能,返回类型声明已被引入.返回类型声明指定的一个函数返回值的类型. int float bool string interfaces array callable 对象实例 如下 ...

  8. php.ini 配置项详解

    本文主要对php.ini文件进行详细的解释 engine = On ——> 在apache下启用php语言引擎 short_open_tag = Off ——> 是否开启段标签  若php ...

  9. Oracle--索引视图序列等对象

    ---恢复内容开始--- 索引 与表类似,不仅需要在DD中保存索引的定义,还需要在表空间为它分配实际的存储空间. 将索引和对应的表分别存放在不同硬盘的不同表空间中能够提高查询的速度,因为Oracle能 ...

  10. JSP中四种属性保存范围(1)

    一.四种属性范围 在JSP中提供了四种属性保存范围 page:在一个页面内保存属性,跳转之后无效request:在一次服务请求范围内,服务器跳转后依然有效session:-在一次会话范围内,无论何种跳 ...