转自Android 线程池

public class AppExecutors {private static final String TAG = "AppExecutors";/**磁盘IO线程池**/private final ExecutorService diskIO;/**网络IO线程池**/private final ExecutorService networkIO;/**UI线程**/private final Executor mainThread;/**定时任务线程池**/private final ScheduledExecutorService scheduledExecutor;private volatile static AppExecutors appExecutors;public static AppExecutors getInstance() {if (appExecutors == null) {synchronized (AppExecutors.class) {if (appExecutors == null) {appExecutors = new AppExecutors();}}}return appExecutors;}public AppExecutors(ExecutorService diskIO, ExecutorService networkIO, Executor mainThread, ScheduledExecutorService scheduledExecutor) {this.diskIO = diskIO;this.networkIO = networkIO;this.mainThread = mainThread;this.scheduledExecutor = scheduledExecutor;}public AppExecutors() {this(diskIoExecutor(), networkExecutor(), new MainThreadExecutor(), scheduledThreadPoolExecutor());}/*** 定时(延时)任务线程池* * 替代Timer,执行定时任务,延时任务*/public ScheduledExecutorService scheduledExecutor() {return scheduledExecutor;}/*** 磁盘IO线程池(单线程)* * 和磁盘操作有关的进行使用此线程(如读写数据库,读写文件)* 禁止延迟,避免等待* 此线程不用考虑同步问题 */public ExecutorService diskIO() {return diskIO;}/*** 网络IO线程池* * 网络请求,异步任务等适用此线程* 不建议在这个线程 sleep 或者 wait  */public ExecutorService networkIO() {return networkIO;}/*** UI线程* * Android 的MainThread* UI线程不能做的事情这个都不能做*/public Executor mainThread() {return mainThread;}private static ScheduledExecutorService scheduledThreadPoolExecutor() {return new ScheduledThreadPoolExecutor(16, r -> new Thread(r, "scheduled_executor"), (r, executor) -> Log.e(TAG, "rejectedExecution: scheduled executor queue overflow"));}private static ExecutorService diskIoExecutor() {return new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(1024), r -> new Thread(r, "disk_executor"), (r, executor) -> Log.e(TAG, "rejectedExecution: disk io executor queue overflow"));}private static ExecutorService networkExecutor() {return new ThreadPoolExecutor(3, 6, 1000, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(6), r -> new Thread(r, "network_executor"), (r, executor) -> Log.e(TAG, "rejectedExecution: network executor queue overflow"));}private static class MainThreadExecutor implements Executor {private final Handler mainThreadHandler = new Handler(Looper.getMainLooper());@Overridepublic void execute(@NonNull Runnable command) {mainThreadHandler.post(command);}}
}

用法:

UI线程:

 AppExecutors.getInstance().mainThread().execute(new Runnable() {@Overridepublic void run() {//do something}});

磁盘IO线程池

 AppExecutors.getInstance().diskIO().execute(new Runnable() {@Overridepublic void run() {//do something}});

网络IO线程池

 AppExecutors.getInstance().networkIO().execute(new Runnable() {@Overridepublic void run() {//do something}});

定时(延时)任务线程池

延时3秒后执行:

AppExecutors.getInstance().scheduledExecutor().schedule(new Runnable() {@Overridepublic void run() {// do something}},3,TimeUnit.SECONDS);

5秒后启动第一次,每3秒执行一次(第一次开始执行和第二次开始执行之间间隔3秒)

AppExecutors.getInstance().scheduledExecutor().scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {// do something}}, 5, 3, TimeUnit.MILLISECONDS);

5秒后启动第一次,每3秒执行一次(第一次执行完成和第二次开始之间间隔3秒)

AppExecutors.getInstance().scheduledExecutor().scheduleWithFixedDelay(new Runnable() {@Overridepublic void run() {// do something}}, 5, 3, TimeUnit.MILLISECONDS);

取消 定时(延时)任务

上面3个方法都会有一个如下返回值:

ScheduledFuture<?> scheduledFuture;

取消定时器(等待当前任务结束后,取消定时器)

scheduledFuture.cancel(false);

取消定时器(不等待当前任务结束,取消定时器)

scheduledFuture.cancel(true);

当然,以上用的都是双重检查(double-check)单例模式。

在我的项目中,没有使用单例模式:
也暂时没有什么问题

/*** Global executor pools for the whole application.* <p>* Grouping tasks like this avoids the effects of task starvation (e.g. disk reads don't wait behind* webservice requests).*/
public class AppExecutors {private final Executor mDiskIO;private final Executor mNetworkIO;private final Executor mMainThread;private final ScheduledThreadPoolExecutor schedule;public AppExecutors() {this.mDiskIO = Executors.newSingleThreadExecutor();this.mNetworkIO = Executors.newFixedThreadPool(3);this.mMainThread = new MainThreadExecutor();this.schedule = new ScheduledThreadPoolExecutor(5, new ThreadPoolExecutor.AbortPolicy());}public Executor diskIO() {return mDiskIO;}public ScheduledThreadPoolExecutor schedule() {return schedule;}public Executor networkIO() {return mNetworkIO;}public Executor mainThread() {return mMainThread;}private static class MainThreadExecutor implements Executor {private Handler mainThreadHandler = new Handler(Looper.getMainLooper());@Overridepublic void execute(@NonNull Runnable command) {mainThreadHandler.post(command);}}
}

优化版(单例模式+线程加名):

public class AppExecutors {private final Executor mDiskIO;private final Executor mNetworkIO;private final Executor mMainThread;private final ScheduledThreadPoolExecutor schedule;private static AppExecutors instance;private static Object object = new Object();public static AppExecutors getInstance() {if (instance == null) {synchronized (object) {if (instance == null) {instance = new AppExecutors();}}}return instance;}private AppExecutors() {this.mDiskIO = Executors.newSingleThreadExecutor(new MyThreadFactory("single"));this.mNetworkIO = Executors.newFixedThreadPool(3, new MyThreadFactory("fixed"));this.mMainThread = new MainThreadExecutor();this.schedule = new ScheduledThreadPoolExecutor(5, new MyThreadFactory("sc"), new ThreadPoolExecutor.AbortPolicy());}class MyThreadFactory implements ThreadFactory {private final String name;private int count = 0;MyThreadFactory(String name) {this.name = name;}@Overridepublic Thread newThread(@NonNull Runnable r) {count++;return new Thread(r, name + "-" + count + "-Thread");}}public Executor diskIO() {return mDiskIO;}public ScheduledThreadPoolExecutor schedule() {return schedule;}public Executor networkIO() {return mNetworkIO;}public Executor mainThread() {return mMainThread;}private static class MainThreadExecutor implements Executor {private Handler mainThreadHandler = new Handler(Looper.getMainLooper());@Overridepublic void execute(@NonNull Runnable command) {mainThreadHandler.post(command);}}
}

Android 线程池管理工具类相关推荐

  1. android 软键盘工具类,Android软键盘管理工具类

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 一个软键盘管理类,单例模式实现的. /** * 类功能描述:软键盘管理界面 * */ public class Inpu ...

  2. Java基础加强重温_08:线程不安全、线程同步、线程状态、线程状态切换、线程池(Executors类、newFixedThreadPool)、死锁、Lambda表达式、Stream

    摘要 Java基础加强重温_08: 线程安全(线程安全概念.线程不安全案例). 线程同步(同步代码块.同步方法.Lock锁,锁对象). 线程状态(new新建.Runnable可运行.Blocked锁阻 ...

  3. Android 线程池概念及使用

    一:使用线程池的原因 在android开发中经常会使用多线程异步来处理相关任务,而如果用传统的newThread来创建一个子线程进行处理,会造成一些严重的问题: 在任务众多的情况下,系统要为每一个任务 ...

  4. Android线程池封装库

    目录介绍 1.遇到的问题和需求 1.1 遇到的问题有哪些 1.2 遇到的需求 1.3 多线程通过实现Runnable弊端 1.4 为什么要用线程池 2.封装库具有的功能 2.1 常用的功能 3.封装库 ...

  5. android 线程池

    为什么用线程池 创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率 例如: 记创建线程消耗时间T1,执行任务消耗时间T2,销毁线程消耗时间T3 如果T1+T3>T2 ...

  6. 【转】1.2异步编程:使用线程池管理线程

    从此图中我们会发现 .NET 与C# 的每个版本发布都是有一个"主题".即:C#1.0托管代码→C#2.0泛型→C#3.0LINQ→C#4.0动态语言→C#5.0异步编程.现在我为 ...

  7. Android线程池的简单使用

    参考链接 https://blog.csdn.net/u012702547/article/details/52259529 https://blog.csdn.net/wolf909867753/a ...

  8. Android 线程池的使用

    线程池优点 提到线程池就必须先说一下线程池的优点,线程池的优点可以概括为以下四点: * 重用线程池中的线程,避免因为线程的创建和销毁所带来的性能开销: * 线程池旨在线程的复用,就避免了创建线程和销毁 ...

  9. 一个好用的日志管理工具类MyLogger

    日志的规范管理,在项目中不容忽视,应用上线后将调试日志关闭也是十分必要的,下面就是一个好用的日志管理工具类(点击下载): import java.util.Hashtable;import andro ...

最新文章

  1. ios开发日记- 5 屏幕截图
  2. python bound unbound method
  3. 全国计算机等级考试题库二级C操作题100套(第41套)
  4. macbook 下载时睡眠_MacBook进入睡眠状态时如何自动使其静音
  5. SQOOP对分隔符支持情况的验证
  6. 简述Java Object类中的方法有哪些
  7. TE和TM主模式的介绍
  8. DNN训练技巧(Tips for Training DNN)
  9. HTML请选择编程,html – 设计选择标记
  10. matlab分段拟合程序,如何用matlab拟合出分段函数?
  11. H3C Wx5004无线控制器修改SSID名称
  12. Windows下QT5.9构建的debug或release文件打包后不能使用
  13. idea 2018汉化包(附使用教程)
  14. android北京实时公交,北京实时公交app
  15. 把m个球放到n个盒子里,有多少种方法 球盒问题,8种情况
  16. 用matlab软件心得体会,MATLAB软件实训报告 - 图文
  17. 浅谈网页设计中的构图
  18. 谷歌打开后开始页面被hao123篡改
  19. import mysql.connector 报错
  20. 常见的网络连接设备有哪些?

热门文章

  1. 告别脚本小子系列丨JAVA安全(7)——反序列化利用链(中)
  2. 【持续更新】影视资源采集站 影视站长必备全部资料整理
  3. 怎样在电脑上上传图片_怎样把手机里的照片传到电脑里?具体操作方法
  4. mysql使用jdbc连接增加ssl认证
  5. Swap 2 Secrets via Homomorphic Properties of Shamir Secret Sharing
  6. ouster-32激光雷达使用---雷达输出数据分析
  7. 事业单位计算机类专技岗职称,事业单位,专技岗晋升容易吗?
  8. 人资项目-员工信息详情页
  9. 口语语汇单词篇(12)
  10. 可靠信号与不可靠信号