美文网首页
android线程管理--线程池

android线程管理--线程池

作者: MrMagicWang | 来源:发表于2016-09-05 11:06 被阅读1066次

为什么要引入线程池?

1.new Thread()的缺点

  • 每次new Thread()耗费性能
  • 调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制创建,之间相互竞争,会导致过多占用系统资源导致系统瘫痪。
  • 不利于扩展,比如如定时执行、定期执行、线程中断

2.采用线程池的优点

  • 重用存在的线程,减少对象创建、消亡的开销,性能佳
  • 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞
  • 提供定时执行、定期执行、单线程、并发数控制等功能
Executor

android中线程池的概念来源于java中的Executor, 线程池真正的实现类是ThreadPoolExecutor,它间接实现了Executor接口。
Executor接口只有一个方法execute(),该方法用来执行线程中的操作。

Executor executor = new MyExecutor();
executor.execute(new RunnableTaskOne());
executor.execute(new RunnableTaskTwo());

ThreadPoolExecutor提供了一系列参数来配置线程池,通过不同的参数配置实现不同功能特性的线程池,android中的Executors类提供了4个工厂方法用于创建4种不同特性的线程池给开发者用.

  1. newFixedThreadPool
    创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。
ExecutorService executorService = Executors.newFixedThreadPool(5);
for (int i = 0; i < 20; i++) {
      Runnable syncRunnable = new Runnable() {
          @Override
          public void run() {
               Log.e(TAG, Thread.currentThread().getName());
          }
       };
       executorService.execute(syncRunnable);
}

运行结果:总共只会创建5个线程, 开始执行五个线程,当五个线程都处于活动状态,再次提交的任务都会加入队列等到其他线程运行结束,当线程处于空闲状态时会被下一个任务复用
特点:只有核心线程数,并且没有超时机制,因此核心线程即使闲置时,也不会被回收,因此能更快的响应外界的请求.

  1. newCachedThreadPool
    创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程
ExecutorService executorService = Executors.newCachedThreadPool(5);
for (int i = 0; i < 100; i++) {
      Runnable syncRunnable = new Runnable() {
          @Override
          public void run() {
               Log.e(TAG, Thread.currentThread().getName());
          }
       };
       executorService.execute(syncRunnable);
}

运行结果:缓存线程池大小是不定值,可以需要创建不同数量的线程,在使用缓存型池时,先查看池中有没有以前创建的线程,如果有,就复用.如果没有,就新建新的线程加入池中,缓存型池子通常用于执行一些生存期很短的异步型任务
特点:没有核心线程,非核心线程数量没有限制, 超时为60秒.

  1. newScheduledThreadPool
    创建一个定长线程池,支持定时及周期性任务执行
    ** schedule(Runnable command,long delay, TimeUnit unit)**创建并执行在给定延迟后启用的一次性操作
ExecutorService executorService = Executors.newScheduledThreadPool(5);
for (int i = 0; i < 200; i++) {
      Runnable syncRunnable = new Runnable() {
          @Override
          public void run() {
               Log.e(TAG, Thread.currentThread().getName());
          }
       };
       executorService.schedule(syncRunnable, 5000, TimeUnit.MILLISECONDS);
}

特点:核心线程数是固定的,非核心线程数量没有限制, 没有超时机制.主要用于执行定时任务和具有固定周期的重复任务.

  1. SingleThreadExecutor
    创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行
ExecutorService executorService = Executors.newScheduledThreadPool(5);
for (int i = 0; i < 200; i++) {
      Runnable syncRunnable = new Runnable() {
          @Override
          public void run() {
               Log.e(TAG, Thread.currentThread().getName());
          }
       };
       executorService.execute(syncRunnable);
}

特点:只有一个核心线程,并没有超时机制.意义在于统一所有的外界任务到一个线程中, 这使得在这些任务之间不需要处理线程同步的问题.

相关文章

  • 线程池创建和相关知识

    线程池创建(单例):Android线程池得要这么用 - 简书 线程池相关知识:Android开发之线程池使用总结 ...

  • Android线程池的使用

    一、线程与线程池,为什么要使用线程池 1、Android中的线程 在Android中有主线程和子线程的区分。主线程...

  • 线程池设计

    线程池管理器(CustomThreadPool): 用于创建并管理线程池工作线程(CustomWorker):线程...

  • 线程池

    线程池组件 1、线程池管理器(ThreadPoolManager):用于创建并管理线程池 2、工作线程(WorkT...

  • android线程管理--线程池

    为什么要引入线程池? 1.new Thread()的缺点 每次new Thread()耗费性能 调用new Thr...

  • 线程池

    话题:线程池Android中的线程池有哪些?它们的区别是什么?为什么要使用线程池? 线程是Android里面一个很...

  • 线程池

    线程池 a. 基本组成部分: 1、线程池管理器(ThreadPool):用于创建并管理线程池,包括创建线程池,销毁...

  • Android高并发问题处理和线程池ThreadPool线程池源

    Android实现高性能,高并发,可延时线程池管理 为什么要使用线程池? 1.)new Thread()的缺点 每...

  • Android的线程和线程池

    Android的线程和线程池 标签(空格分隔): android 一些概念: 线程分类:主线程和子线程,主线程主要...

  • 笔记:Android线程和线程池

    Android线程和线程池 Android中的线程操作相关的类有 AsyncTask IntentService ...

网友评论

      本文标题:android线程管理--线程池

      本文链接:https://www.haomeiwen.com/subject/khglettx.html