定制自己的线程池管理类、防止OOM

在Android开发中、涉及比较深的话、我们会用到线程池来做异步操作

比如下载图片、执行异步任务等、为了方便管理、继承一个线程池管理类、

在使用线程的时候只需要 submmitJob和removeJob、不会产生大量的线程、有效防止OOM

代码如下:


import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadPool {
    private static final String TAG = "ThreadPool";
    private static ThreadPool instance;
    private ThreadPoolExecutor threadPool = null;
    private static final int CORE_POOL_SIZE = 3;
    private static final int MAX_POOL_SIZE = 8;
    private static final int KEEP_ALIVE_TIME = 10; // 10 seconds

    private ThreadPool() {
        threadPool = new ThreadPoolExecutor(CORE_POOL_SIZE,MAX_POOL_SIZE,KEEP_ALIVE_TIME,
                TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(),
                new PriorityThreadFactory("mthread-pool",
                android.os.Process.THREAD_PRIORITY_BACKGROUND));
    }

    public static synchronized ThreadPool getInstance(){
        if(instance == null){
            instance = new ThreadPool();
        }
        return instance;
    }

    public void removeJob(Runnable task){
        threadPool.remove(task);
    }

    /***
     * 线程池执行command
     * @param r
     */
    public void submmitJob(Runnable r){
        threadPool.execute(r);
    }

}

使用说明

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ThreadPool.getInstance().submmitJob(r);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        ThreadPool.getInstance().removeJob(r);
    }
    private Runnable r = new Runnable() {
        @Override
        public void run() {
        //do something
        }
    };

参数说明

参数名 作用
corePoolSize 核心线程池大小
maximumPoolSize 线程池中超过corePoolSize数目的空闲线程最大存活时间;可以allowCoreThreadTimeOut(true)使得核心线程有效时间
TimeUnit keepAliveTime时间单位
workQueue 阻塞任务队列
threadFactory 新建线程工厂
RejectedExecutionHandler 当提交任务数超过maxmumPoolSize+workQueue之和时,任务会交给RejectedExecutionHandler来处理

重点讲解:

其中比较容易让人误解的是:corePoolSize,maximumPoolSize,workQueue之间关系。

1.当线程池小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。

2.当线程池达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行

3.当workQueue已满,且maximumPoolSize>corePoolSize时,新提交任务会创建新线程执行任务

4.当提交任务数超过maximumPoolSize时,新提交任务由RejectedExecutionHandler处理

5.当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时,关闭空闲线程

6.当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭

时间: 2024-10-07 05:31:29

定制自己的线程池管理类、防止OOM的相关文章

java 线程池管理类:Executors

java.util.concurrent类 Executors java.lang.Object   继承者 java.util.concurrent.Executors此类是个工具类,它提供对Executor.ExecutorService.ScheduledExecutorService.ThreadFactory 和 Callable 类的一些实用方法. 此类支持以下各种方法:    * 创建并返回设置有常用配置的ExecutorService的方法.    * 创建并返回设置有常用配置的

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

题记-- 难过了,悄悄走一走: 伤心了,默默睡一觉: 优雅不是训练出来的,而是一种阅历: 淡然不是伪装出来的,而是一种沉淀: 时间飞逝,老去的只是我们的容颜: 时间仿佛一颗灵魂,越来越动人: 1.简述: 在多线程的世界中,是那么的神奇 与 高效以及合理: 2.创建线程池实例 官方推荐使用Executors类工厂方法来创建线程池管理,Executors类是官方提供的一个工厂类,里面封装了好多功能不一样的线程池,从而使得我们创建线程池非常的简单:                    3.使用线程池

Java线程池工具类

使用线程池的好处: 重用线程,线程的创建和销毁是很耗时的. 控制线程的数量. 线程池工具类: ThreadPool.java package com.zws.thread.pool; import java.util.concurrent.Callable; import java.util.concurrent.Future; /**  *   * @author wensh.zhu  *  */ public interface ThreadPool { void execute(Runna

java线程池ThreadPoolExecutor类使用详解

在<阿里巴巴java开发手册>中指出了线程资源必须通过线程池提供,不允许在应用中自行显示的创建线程,这样一方面是线程的创建更加规范,可以合理控制开辟线程的数量:另一方面线程的细节管理交给线程池处理,优化了资源的开销.而线程池不允许使用Executors去创建,而要通过ThreadPoolExecutor方式,这一方面是由于jdk中Executor框架虽然提供了如newFixedThreadPool().newSingleThreadExecutor().newCachedThreadPool(

java 线程池 ---- ThreadPoolExecutor 类

执行流程 1, 创建线程池后, 默认不会创建线程, 等到有任务带来才创建线程, 即一个线程处理一个任务 2, 当线程数量达到核心线程数时, 任务放进队列, 如果放入队列失败, 创建新线程处理任务(此时线程池线程数大于核心线程数) 3, 如果线程数大于最大线程数, 执行拒绝策略处理任务 构造方法 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, Block

JAVA线程池管理(一)

作为一个接触线程不太深的屌丝而言,多线程现在已经是一个不得不去了解的技术点了,单线程系统现在已经无法满足大多数的项目了.而一个程序员是否能够理解并使用多线程应该也算是一个程序员好坏的标准之一.以下是我看一些大神的关于多线程的博客中的一些心得体会. 1.首先一个进程对应至少一个线程,这个是比较好理解的,进程包含了线程.就比如一条大路,这就是一条进程,而路上行驶的车辆就是线程. 2.当一个进程有多个用户进行访问的时候,那么这个线程将会开启多条线程.就比如这条路上有很多车正在行驶,那么我们可以把多个车

线程池管理线程及线程间通信

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading; namespace ConsoleTest{ public class ClassThread { //监听线程事件 private ManualResetEvent myResetEvent = new ManualResetEvent(false); private ManualRe

Java newFixedThreadPool线程池实例及讲解

闲话不多说,直接上代码. <span style="font-size:18px;">import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class MyThreadPool { private ExecutorService exe; private static final int POOL_SIZE = 4; public MyThread

VB.net学习笔记(三十)认识线程池

水是生命之源,计算机资源也一样. 每一线程尤如一滴水,你花一滴,我花一滴,你还一滴,我还一滴,就象游兵散将一样,线程越多,越复杂混乱.而每一个线程创建需要开销,活动的线程也需要开销.过多的线程导致系统内存占用过度或系统资源不足.为了解决线程生命周期开销问题和资源不足问题,创建线程池,让每滴水(线程)纳入统一管理.特别是那些生存期比较短暂的线程.使用线程池执行任务比每次完成一个任务时都创建一个全新的线程,随后又删除掉的做法更有效率. 一.线程池管理 线程池管埋是指在多线程应用程序的初始化过程屮创建