关闭

Android中采用线程池进行线程的管理

1003人阅读 评论(0) 收藏 举报
分类:

当遇到耗时操作,比如网络请求,频繁更新UI界面,这时就需要开启子线程,至于为什么开启子线程,无非防止阻塞UI线程,也就是主线程,防止造成ANR,也就是应用程序无响应。大家可能会觉得很简单,因为只要下面一句:

new Thread(new Runnable() {
                    @Override
                    public void run() {

                    }
                }).start();

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


这时就需要Android的线程池机制来管理子线程。

Android的线程池与JAVA线程池基本是一样的,

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

下面给出一段典型管理子线程的代码:

import java.util.concurrent.Executor;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * Created by QHF on 2016/5/31.
 */
public class ThreadManager {


    private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
    private static final int CORE_POOL_SIZE = CPU_COUNT + 1;
    private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
    private static final long KEEP_ALIVE = 10L;


    private static final ThreadFactory sThreadFactory = new ThreadFactory() {
        private final AtomicInteger mCount = new AtomicInteger(1);

        public Thread newThread(Runnable r) {
            return new Thread(r, "ImageLoader#" + mCount.getAndIncrement());
        }
    };

    public static final Executor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(
            CORE_POOL_SIZE, MAXIMUM_POOL_SIZE,
            KEEP_ALIVE, TimeUnit.SECONDS,
            new LinkedBlockingQueue<Runnable>(), sThreadFactory);
}

当需要使用管理子线程的时候:

Runnable updateUITask = new Runnable() {

            @Override
            public void run() {
                
                //耗时操作或者频繁更新UI操作    
            }
        };
        ThreadManager.THREAD_POOL_EXECUTOR.execute(updateUITask);









2
1
查看评论

Android多线程操作——线程池管理综述

1、常用线程池创建使用分析 2、自定义线程池
  • zl18603543572
  • zl18603543572
  • 2016-07-24 04:58
  • 1269

Android中使用线程池来管理线程

背景:每出现一个耗时操作都去创建一个新的线程必然不优美,既没有高并发,对资源的共享和竞争也是比较混乱。总之: a. 每次new Thread新建对象性能差。 b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。 c. 缺乏更多功能,如定时执行、定期...
  • night_dragon
  • night_dragon
  • 2017-01-13 16:37
  • 456

Android 线程池管理

Android 线程池管理   ThreadPoolExecutor 线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为: ThreadPoolExecutor(int corePoolSize, int maximu...
  • lxmhuendan
  • lxmhuendan
  • 2012-08-09 11:31
  • 7134

Android开发之线程池使用总结

线程池算是Android开发中非常常用的一个东西了,只要涉及到线程的地方,大多数情况下都会涉及到线程池。Android开发中线程池的使用和Java中线程池的使用基本一致。那么今天我想来总结一下Android开发中线程池的使用。OK,假如说我想做一个新闻应用,ListView上有一个item,每个it...
  • u012702547
  • u012702547
  • 2016-08-20 20:49
  • 22373

Android 线程池来管理线程

网上讲了很多的关于线程池的例子。其实在我们实际应用中,譬如说,一个应用的线程是怎样来管理的,我们就可以说,我们可以使用线程池来管理线程。 eg: class DianLiang1 implements Runnable { @Override punlic void Run{...
  • androidstarjack
  • androidstarjack
  • 2015-04-28 09:33
  • 1396

管理android线程池

public class ThreadManager { private ThreadManager() { } private static ThreadManager instance = new ThreadManager(); private ThreadPool...
  • slowsnowscar
  • slowsnowscar
  • 2016-08-11 11:24
  • 365

android线程管理一(进程与线程)

前言      如果某个应用程序组件是第一次被启动,且这时应用程序也没有其他组件在运行,则Android系统会为应用程序创建一个包含单个线程的linux进程。默认情况下,同一个应用程序的所有组件都运行在同一个进程和线程里(这个线程叫做“main”主线程)。如果组件...
  • lu1024188315
  • lu1024188315
  • 2017-07-15 12:09
  • 395

Android线程与线程池

初识线程池 我们在Android线程分析中,讲到了线程的概念以及一些扩展线程。那么我们考虑一个问题,我如果需要同时做很多事情,是不是给每一个事件都开启一个线程呢?那如果我的事件无限多呢?频繁地创建/销毁线程,CPU该吃不消了吧。所以,这时候线程池的概念就来了。我们举个例子来阐述一下线程池大致工作原...
  • weixin_36244867
  • weixin_36244867
  • 2017-06-02 11:23
  • 2064

Android多线程机制详细解析

或许你曾经需要项目中进行后台工作比如数据库访问或者网络连接,如果你按照以前的做法,直接在点击事件或者onCreate方法中直接调用访问数据库或者服务器的方法,你就会遇到大多数Android程序员都遇到过的这么一个错误:android.view.ViewRootImpl$CalledFromWrong...
  • IT_ZJYANG
  • IT_ZJYANG
  • 2016-04-18 16:19
  • 2481

Android开发——Android中常见的4种线程池(保证你能看懂并理解)

0.前言使用线程池可以给我们带来很多好处,首先通过线程池中线程的重用,减少创建和销毁线程的性能开销。其次,能控制线程池中的并发数,否则会因为大量的线程争夺CPU资源造成阻塞。最后,线程池能够对线程进行管理,比如使用scheduleThreadPool.scheduleAtFixedRate(myRu...
  • SEU_Calvin
  • SEU_Calvin
  • 2016-09-03 10:44
  • 32771
    个人资料
    • 访问:106369次
    • 积分:2043
    • 等级:
    • 排名:千里之外
    • 原创:76篇
    • 转载:8篇
    • 译文:0篇
    • 评论:55条
    最新评论