Android平台Java线程池启动耗时.

来源:互联网 发布:软件未响应关不掉 编辑:程序博客网 时间:2024/04/20 13:50

异步任务线程策略

在项目过程, 常用Java线程池来异步完成特定任务, 特别是对于Android手机平台来说.

在具体的实施过程中, 有以下几种策略:

  • 来一个新的任务, 启动一个新的线程, 任务结束后线程结束, 简称为 ThreadStart.
  • 开启cached线程, 一定时间上实现线程的复用, 免去重复创建线程的问题, 简称为 ThreadCache
  • 开启固定数量的线程池, 简称为 ThreadFix
  • 开启一个线程池, 预先启动固定大小的线程, 忙时线程数量可随着任务数量增长而增长, 闲时回归到固定大小的数量, 简称为RcThread.

多线程并发任务

对于一些实时性要求较高任务, 选择不同的策略, 会有着不同的耗时.
有着这样的情况, 并发4.5个线程去完成同一个任务, 以提高任务完成的实时性和可靠性, 譬如说到不同的服务器上实时取相同的资源, 以达到快速和可靠的效果.

这个耗时可以分为 本地耗时 + 网络耗时 + 服务器处理耗时. 本文只讨论如何降低本地耗时? 线程池模式下, 两个方面来考虑 , 一个是头一个线程启动耗时, 另外一个最后一个线程的启动耗时(也即连续启动4个线程的耗时).

头一个线程启动耗时

在一个手机上, 运行以下程序:

  1. ThreadStart模式连续启动4个线程, 采集最先开始运行的线程的启动时间.
  2. sleep 10 秒钟.
  3. ThreadCache模式, 连续提交4个任务, 采集最先开始运行的线程的启动时间.
  4. sleep 10 秒钟
  5. ThreadFix(4个线程)模式, 连续提交4个任务, 采集最先开始运行的线程的启动时间.
  6. sleep 10 秒钟
  7. RcThread(预先启动4个线程)模式, 连续提交4个线程, 采集最先开始运行的线程的启动时间.
  8. sleep 10秒钟,
  9. goto step 1, 循环60次.

将会得到以下的结果:

这里写图片描述

注释: 时间单位为ms, 测试手机为 华为3X.
可见, RcThread预启动模式与ThreadFix模式数据差不多, 数据较平稳, 均值不大, 其他两种尖峰数据较多, 不够平稳, 且均值较大.

最后一个线程启动耗时

在一个手机上, 运行以下程序:

  1. ThreadStart模式连续启动4个线程, 采集最后一个开始运行的线程的启动时间.
  2. sleep 10 秒钟.
  3. ThreadCache模式, 连续提交4个任务, 采集最后开始运行的线程的启动时间.
  4. sleep 10 秒钟
  5. ThreadFix(4个线程)模式, 连续提交4个任务, 采集最后开始运行的线程的启动时间.
  6. sleep 10 秒钟
  7. RcThread(预先启动4个线程)模式, 连续提交4个线程, 采集最后开始运行的线程的启动时间.
  8. sleep 10秒钟,
  9. goto step 1, 循环60次.

得到以下结果:

这里写图片描述

注释: 时间单位ms, 测试手机为 华为3X.
可见, RcThread预启动模式与ThreadFix模式数据差不多, 数据较平稳, 均值不大, 其他两种尖峰数据较多, 不够平稳, 且均值较大.

0 0
原创粉丝点击