http://www.trinea.cn/android/java-android-thread-pool/

介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用。本文是基础篇,后面会分享下线程池一些高级功能。

1、new Thread的弊端
执行一个异步任务你还只是如下new Thread吗?

new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}}).start();

a. 每次new Thread新建对象性能差。
b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。
c. 缺乏更多功能,如定时执行、定期执行、线程中断。
相比new Thread,Java提供的四种线程池的好处在于:
a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。
b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
c. 提供定时执行、定期执行、单线程、并发数控制等功能。

2、Java 线程池
Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

(1). newCachedThreadPool
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。示例代码如下:

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
final int index = i;
try {
Thread.sleep(index * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
cachedThreadPool.execute(new Runnable() {
@Override
public void run() {
System.out.println(index);
}
});
}

线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。

(2). newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。示例代码如下:

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
final int index = i;
fixedThreadPool.execute(new Runnable() {
@Override
public void run() {
try {
System.out.println(index);
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}

因为线程池大小为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字。

定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()。可参考PreloadDataCache。

(3) newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下:

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
scheduledThreadPool.schedule(new Runnable() {
@Override
public void run() {
System.out.println("delay 3 seconds");
}}, 3, TimeUnit.SECONDS);

表示延迟3秒执行。

定期执行示例代码如下:

scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("delay 1 seconds, and excute every 3 seconds");
}
}, 1, 3, TimeUnit.SECONDS);

表示延迟1秒后每3秒执行一次。

ScheduledExecutorService比Timer更安全,功能更强大,后面会有一篇单独进行对比。

(4)、newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下:

ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) { final int index = i; singleThreadExecutor.execute( new Runnable() {
@Override  public void run() {
try {    System.out.println(index);    Thread.sleep(2000);   }
catch (InterruptedException e) {
// TODO Auto-generated catch block    e.printStackTrace();
}  } });}

结果依次输出,相当于顺序执行各个任务。

现行大多数GUI程序都是单线程的。Android中单线程可用于数据库操作,文件操作,应用批量安装,应用批量删除等不适合并发但可能IO阻塞性及影响UI线程响应的操作。

Android之线程池相关推荐

  1. Android应用线程池最大线程数量

    Android应用线程池最大线程数量 线程池的大小经验值一般这样设置:(其中N为CPU的核数)  如果是CPU密集型应用,则线程池大小设置为N+1  如果是IO密集型应用,则线程池大小设置为2N+1 ...

  2. android自定义线程池工具类,妈妈再也不用担心你不会使用线程池了(ThreadUtils)...

    为什么要用线程池 使用线程池管理线程有如下优点:降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行. 提高线程的可 ...

  3. Android 自定义线程池的实战

    前言:在上一篇文章中我们讲到了AsyncTask的基本使用.AsyncTask的封装.AsyncTask 的串行/并行线程队列.自定义线程池.线程池的快速创建方式. 对线程池不了解的同学可以先看 An ...

  4. 【Android】线程池

    在Android中,主线程不能执行耗时的操作,否则可能会导致ANR.那么,耗时操作应该在其它线程中执行.线程的创建和销毁都会有性能开销,创建过多的线程也会由于互相抢占系统资源而导致阻塞的现象.这个时候 ...

  5. android asynctask 线程池,AsyncTask和线程池

    在Android中,UI操作是线程不安全的,如果想要在子线程中进行UI操作,或者在主线程中进行耗时操作,则需要借助Android的异步消息处理机制.但我们需要开启N个线程的时候,我们可以这样做: 直接 ...

  6. Android开发线程池管理类之ThreadPoolExecutor工具类

    平常开发中网络请求自从Android4.0后强制要求放到子线程中避免主线程进行网络请求,一般很多人习惯直接通过new Thread的方法.不建议这样使用.我们用ThreadPoolExecutor线程 ...

  7. Android开发-线程池

    最近发现很多人对于安卓的线程池的理解会比较低 本准备自己写一篇的,但是发现了一篇总结的比较全的博客 所以转载过来分享给大家 文章出自君宝,有些地方做了修改,请作者原谅 文章最下方有我自己自定义的线程池 ...

  8. Android线程池封装库

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

  9. android中的线程池学习笔记

    阅读书籍: Android开发艺术探索 Android开发进阶从小工到专家 对线程池原理的简单理解: 创建多个线程并且进行管理,提交的任务会被线程池指派给其中的线程进行执行,通过线程池的统一调度和管理 ...

最新文章

  1. MATLAB问题解决方案- Matlab出现报错:​‘***‘不是内部或外部命令,也不是可运行的程序或批处理文件
  2. leetcode 279 四平方定理
  3. Protecting the Flowers(POJ-3262)
  4. Android 下 Kernel Debug (Qualcomm Chipset)
  5. dev控件调用html页面,Chrome开发工具 扩展 DevTools
  6. 【推荐视频】分布式机器学习框架如何助力高维实时推荐系统
  7. MVC 打印解决方案--SNF快速开发平台3.1
  8. java xstream json_详解XML,Object,Json转换与Xstream的使用
  9. cad导出pdf_手机如何一键分享CAD图纸?(差点成了背锅大侠)
  10. 河南初中信息技术测试软件,中学信息技术考试练习系统——河南省版
  11. 常用英语前缀和全部英语前缀——138个
  12. BMI体重指数计算器
  13. android恢复出厂设置流程图,Android recovery模式
  14. 在计算机中360云盘如何删除文件,如何在360云盘中检索已删除的文件
  15. win10系统64位( 惠普)台式电脑自动开机、关机图文详细解(一)
  16. Python下载新浪微博视频(流式下载)
  17. ml-agents与tensorflow结合的先关操作文档
  18. nodejs stream 经典解析
  19. 为什么亚马逊AWS EC2 ping会不通
  20. Sqlite3 学习记录

热门文章

  1. 前端老弟第一次写后端,崩了!
  2. 如何在没有 System.Drawing.Common 的情况下使用 C# 获取图片格式
  3. 运维小姐姐说这篇Consul集群和ACL配置超给力(保姆级)
  4. 聊聊自驱团队的构建(四)
  5. 跟我一起学.NetCore之中间件(Middleware)简介和解析请求管道构建
  6. 从零开始内建你的安全测试流程
  7. Azure App Service 如何在第一时间用上最新版 .NET Core
  8. Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(三)
  9. 边缘化搭建 DotNet Core 2.1 自动化发布和部署(下)
  10. 一个迄今为止最快的并发键值存储库FASTER诞生