Android之ThreadPoolExecutor源码分析

Java_多线程(创建/同步锁/等待唤醒机制/线程池/AsyncTask) 本文讲解了: 线程的创建 / 同步锁机制 / 等待唤醒机制 / 线程池 / Android的 阅读详情

ThreadPoolExecutor是一个有固定核心线程数的线程池,下面根据源码来详细介绍一下ThreadPoolExecutor的设计和思想

首先看一下ThreadPoolExecutor的类图

这里写图片描述

首先了解一下ThreadPoolExecutor的5种状态

// runState is stored in the high-order bits
    private static final int RUNNING    = -1 << COUNT_BITS;
    private static final int SHUTDOWN   =  0 << COUNT_BITS;
    private static final int STOP       =  1 << COUNT_BITS;
    private static final int TIDYING    =  2 << COUNT_BITS;
    private static final int TERMINATED =  3 << COUNT_BITS;
  1. RUNNING 表示线程池可以接受任务,并且可以运行队列中的任务
  2. SHUTDOWN 停止线程池接受任务,还可以继续运行队列中的任务
  3. STOP 停止线程池接受任务,不可以运行队列中的任务,并尝试去中断正在执行的任务
  4. TIDYING 表示所有的任务都已经通知,核心线程数为0,转到TIDYING的线程即将运行terminated()方法
  5. TERMINATED 表示terminated()执行完毕

5种状态的转换有以下几种方式。
RUNNING -> SHUTDOWN:调用了shutdown方法,或者线程池实现了finalize方法,在里面调用了shutdown方法。
(RUNNING or SHUTDOWN) -> STOP:调用了shutdownNow方法
SHUTDOWN -> TIDYING:当队列和线程池均为空的时候
STOP -> TIDYING:当线程池为空的时候
TIDYING -> TERMINATED:terminated()钩子方法调用完毕

ThreadPoolExecutor executors = (ThreadPoolExecutor) Executors.newFixedThreadPool(size);

这是创建ThreadPoolExecutor的代码,size为固定的核心线程数,看一下源码最终都会走到


public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
        if (corePoolSize < 0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize < corePoolSize ||
            keepAliveTime < 0)
            throw new IllegalArgumentException();
        if (workQueue == null || threadFactory == null || handler == null)
            throw new NullPointerException();
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
        this.keepAliveTime = unit.toNanos(keepAliveTime);
        this.threadFactory = threadFactory;
        this.handler = handler;
    }
  1. corePoolSize 线程核心数
  2. maximumPoolSize 最大的线程数(包括线程核心数+非核心数),发现Android sdk中直接把最大线程数==线程核心数
  3. keepAliveTime 当线程执行完,等到多长时间销毁
  4. unit keepAliveTime 的单位
  5. workQueue 工作线程队列
  6. threadFactory 创建线程的工厂类
  7. handler reject的任务的处理就是靠这个来完成的(当workQueue满了并且达到了最大线程的个数的时候会拒绝加进来的任务,或者调用了shutdown函数之后再加入任务也是会reject的)。

启动ThreadPoolExecutor有俩种方式

ThreadPoolExecutor executors = (ThreadPoolExecutor) Executors.newFixedThreadPool(size);
executors.submit(new Runnable());
executors.execute(new Runnable());

首先看一下submit源码

/**
     * @throws RejectedExecutionException {@inheritDoc}
     * @throws NullPointerException       {@inheritDoc}
     */
    public Future<?> submit(Runnable task) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<Void> ftask = newTaskFor(task, null);
        execute(ftask);
        return ftask;
    }

    /**
     * @throws RejectedExecutionException {@inheritDoc}
     * @throws NullPointerException       {@inheritDoc}
     */
    public <T> Future<T> submit(Runnable task, T result) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<T> ftask = newTaskFor(task, result);
        execute(ftask);
        return ftask;
    }

    /**
     * @throws RejectedExecutionException {@inheritDoc}
     * @throws NullPointerException       {@inheritDoc}
     */
    public <T> Future<T> submit(Callable<T> task) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<T> ftask = newTaskFor(task);
        execute(ftask);
        return ftask;
    }

RunnableFuture ftask = newTaskFor(task, result); 这一行代码只是设置了FutureTask(也继承了Runnable)的回调task和回调以后返回的值result。不管你submit的时候传入的是Runnable还是Callable最后RunnableFuture(FutureTask)里面都会生成Callable对象。任务调用的时候调用RunnableFuture(FutureTask)的run方法,run方法调用Callable对象的call方法。

下面主要看一下execute(runnable)

public void execute(Runnable command) {
        if (command == null)
            throw new NullPointerException();
        /*
         * Proceed in 3 steps:
         *
         * 1. If fewer than corePoolSize threads are running, try to
         * start a new thread with the given command as its first
         * task.  The call to addWorker atomically checks runState and
         * workerCount, and so prevents false alarms that would add
         * threads when it shouldn't, by returning false.
         *
         * 2. If a task can be successfully queued, then we still need
         * to double-check whether we should have added a thread
         * (because existing ones died since last checking) or that
         * the pool shut down since entry into this method. So we
         * recheck state and if necessary roll back the enqueuing if
         * stopped, or start a new thread if there are none.
         *
         * 3. If we cannot queue task, then we try to add a new
         * thread.  If it fails, we know we are shut down or saturated
         * and so reject the task.
         */
        int c = ctl.get();
        //线程数小与核心线程数
        if (workerCountOf(c) < corePoolSize) {
            //添加work到线程池,返回true代表加入成功并运行
            if (addWorker(command, true))
                return;
            c = ctl.get();
        }
        //如果c是正在运行的,就加入workQueue等待执行的队列
        if (isRunning(c) && workQueue.offer(command)) {
            int recheck = ctl.get();
            //再次判断是否为running,如果不是就remove掉
            if (! isRunning(recheck) && remove(command))
                reject(command);
            //是running状态,然后判断线程池中的核心线程数 如果为0,代表没有指定核心线程数size为0
            else if (workerCountOf(recheck) == 0)
                //添加非核心线程到线程池
                addWorker(null, false);
        }
        //只有俩种情况 1:不是running  2:是running但是核心线程数达到最大
        //添加到非核心线程,如果还返回false,那就直接reject
        else if (!addWorker(command, false))
            reject(command);
    }

看上面的注释就是意思

然后看一下addWorker做了什么

private boolean addWorker(Runnable firstTask, boolean core) {
        ...一些线程池的状态判断 省略

        boolean workerStarted = false;
        boolean workerAdded = false;
        Worker w = null;
        try {
            w = new Worker(firstTask);
            final Thread t = w.thread;
            if (t != null) {
                final ReentrantLock mainLock = this.mainLock;
                mainLock.lock();
                try {
                    // Recheck while holding lock.
                    // Back out on ThreadFactory failure or if
                    // shut down before lock acquired.
                    int rs = runStateOf(ctl.get());

                    if (rs < SHUTDOWN ||
                        (rs == SHUTDOWN && firstTask == null)) {
                        if (t.isAlive()) // precheck that t is startable
                            throw new IllegalThreadStateException();
                        workers.add(w);
                        int s = workers.size();
                        if (s > largestPoolSize)
                            largestPoolSize = s;
                        workerAdded = true;
                    }
                } finally {
                    mainLock.unlock();
                }
                if (workerAdded) {
                    t.start();
                    workerStarted = true;
                }
            }
        } finally {
            if (! workerStarted)
                addWorkerFailed(w);
        }
        return workerStarted;
    }

上面代码最主要的逻辑就是 组装Worker,然后workers.add(worker)。

看一下Worker类

private final class Worker
        extends AbstractQueuedSynchronizer
        implements Runnable
    {
        /**
         * This class will never be serialized, but we provide a
         * serialVersionUID to suppress a javac warning.
         */
        private static final long serialVersionUID = 6138294804551838833L;

        /** Thread this worker is running in.  Null if factory fails. */
        final Thread thread;
        /** Initial task to run.  Possibly null. */
        Runnable firstTask;
        /** Per-thread task counter */
        volatile long completedTasks;

        /**
         * Creates with given first task and thread from ThreadFactory.
         * @param firstTask the first task (null if none)
         */
        Worker(Runnable firstTask) {
            setState(-1); // inhibit interrupts until runWorker
            this.firstTask = firstTask;
            this.thread = getThreadFactory().newThread(this);
        }

        /** Delegates main run loop to outer runWorker. */
        public void run() {
            runWorker(this);
        }

上面代码最主要的就是初始化 firstTask和thread,run方法执行runWorker(this)方法
this.thread = getThreadFactory().newThread(this);下面看一下生成Thread代码

static class DefaultThreadFactory implements ThreadFactory {
        private static final AtomicInteger poolNumber = new AtomicInteger(1);
        private final ThreadGroup group;
        private final AtomicInteger threadNumber = new AtomicInteger(1);
        private final String namePrefix;

        DefaultThreadFactory() {
            SecurityManager s = System.getSecurityManager();
            group = (s != null) ? s.getThreadGroup() :
                                  Thread.currentThread().getThreadGroup();
            namePrefix = "pool-" +
                          poolNumber.getAndIncrement() +
                         "-thread-";
        }

        public Thread newThread(Runnable r) {
            Thread t = new Thread(group, r,
                                  namePrefix + threadNumber.getAndIncrement(),
                                  0);
            if (t.isDaemon())
                t.setDaemon(false);
            if (t.getPriority() != Thread.NORM_PRIORITY)
                t.setPriority(Thread.NORM_PRIORITY);
            return t;
        }
    }

创建Thread,如果对Thread不了解的可以去看一下上一篇Java和Android的Thread源码分析。
设置thread为非守护线程,设置thread的优先级为默认的5

Work类就剩下public void run() {runWorker(this);}分析

final void runWorker(Worker w) {
        Thread wt = Thread.currentThread();
        Runnable task = w.firstTask;
        w.firstTask = null;
        w.unlock(); // allow interrupts
        boolean completedAbruptly = true;
        try {
            while (task != null || (task = getTask()) != null) {
                w.lock();
                // If pool is stopping, ensure thread is interrupted;
                // if not, ensure thread is not interrupted.  This
                // requires a recheck in second case to deal with
                // shutdownNow race while clearing interrupt
                if ((runStateAtLeast(ctl.get(), STOP) ||
                     (Thread.interrupted() &&
                      runStateAtLeast(ctl.get(), STOP))) &&
                    !wt.isInterrupted())
                    wt.interrupt();
                try {
                    beforeExecute(wt, task);
                    Throwable thrown = null;
                    try {
                        task.run();
                    } catch (RuntimeException x) {
                        thrown = x; throw x;
                    } catch (Error x) {
                        thrown = x; throw x;
                    } catch (Throwable x) {
                        thrown = x; throw new Error(x);
                    } finally {
                        afterExecute(task, thrown);
                    }
                } finally {
                    task = null;
                    w.completedTasks++;
                    w.unlock();
                }
            }
            completedAbruptly = false;
        } finally {
            processWorkerExit(w, completedAbruptly);
        }
    }

beforeExecute(wt, task);和afterExecute(task, thrown);是空实现,开发者可以自由的操作
第23行 task.run(); 真正每个任务要做的逻辑在这个里面。而且我们前面也说过task是FutureTask,调用FutureTask里面的run方法会调用FutureTask里面Callable的call方法,call方法调用完之后保存住了call的返回值。FutureTask 可以通过get方法得到这个返回值。

看一下getTask()

private Runnable getTask() {
        boolean timedOut = false; // Did the last poll() time out?

        for (;;) {
            int c = ctl.get();
            int rs = runStateOf(c);

            // Check if queue empty only if necessary.
            if (rs >= SHUTDOWN && (rs >= STOP || workQueue.isEmpty())) {
                decrementWorkerCount();
                return null;
            }

            int wc = workerCountOf(c);

            // Are workers subject to culling?
            boolean timed = allowCoreThreadTimeOut || wc > corePoolSize;

            if ((wc > maximumPoolSize || (timed && timedOut))
                && (wc > 1 || workQueue.isEmpty())) {
                if (compareAndDecrementWorkerCount(c))
                    return null;
                continue;
            }

            try {
                Runnable r = timed ?
                    workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :
                    workQueue.take();
                if (r != null)
                    return r;
                timedOut = true;
            } catch (InterruptedException retry) {
                timedOut = false;
            }
        }
    }

getTask()里是实现核心线程堵塞循环的关键;android sdk中的ThreadPoolExecutor的源码里

boolean timed = allowCoreThreadTimeOut || wc > corePoolSize

会永远返回false;

Runnable r = timed ?
                    workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :
                    workQueue.take();

一定会走到take()方法。

LinkedBlockingQueue下的poll

public E poll(long timeout, TimeUnit unit) throws InterruptedException {
        E x = null;
        int c = -1;
        long nanos = unit.toNanos(timeout);
        final AtomicInteger count = this.count;
        final ReentrantLock takeLock = this.takeLock;
        takeLock.lockInterruptibly();
        try {
            while (count.get() == 0) {
                if (nanos <= 0)
                    return null;
                nanos = notEmpty.awaitNanos(nanos);
            }
            x = dequeue();
            c = count.getAndDecrement();
            if (c > 1)
                notEmpty.signal();
        } finally {
            takeLock.unlock();
        }
        if (c == capacity)
            signalNotFull();
        return x;
    }
while (count.get() == 0) {
                if (nanos <= 0)
                    return null;

当为空的时候,等到keepTime然后就返回null,不会造成堵塞。

看一下take()源码

public E take() throws InterruptedException {
    E x;
    int c = -1;
    final AtomicInteger count = this.count;
    final ReentrantLock takeLock = this.takeLock;
    takeLock.lockInterruptibly();
    try {
        while (count.get() == 0) {
            notEmpty.await();
        }
        x = dequeue();
        c = count.getAndDecrement();
        if (c > 1)
            notEmpty.signal();
    } finally {
        takeLock.unlock();
    }
    if (c == capacity)
        signalNotFull();
    return x;
}
while (count.get() == 0) {
    notEmpty.await();
}
x = dequeue();
c = count.getAndDecrement();

**当count==0;会notEmpty.await();造成堵塞。
然后核心线程不断的从workQueue里取出work执行。**

总结流程如下:
1.当池子大小小于corePoolSize就新建线程,并处理请求

2.当池子大小等于corePoolSize,把请求放入workQueue中,池子里的空闲线程就去从workQueue中取任务并处理,如果workQueue没有就堵塞等待

3.当workQueue放不下新入的任务时,新建线程入池,并处理请求,如果池子大小撑到了maximumPoolSize就用RejectedExecutionHandler来做拒绝处理

4.另外,当池子的线程数大于corePoolSize的时候,多余的线程会等待keepAliveTime长的时间,如果无请求可处理就自行销毁

内部结构如下:

这里写图片描述

从中可以发现ThreadPoolExecutor就是依靠BlockingQueue的阻塞机制来维持线程池,当池子里的线程无事可干的时候就通过workQueue.take()阻塞住。

ThreadPoolExecutor的使用和Android常见的4种线程池使用介绍 立即下载

相关推荐

别再折腾虚拟机了!手把手教你用WSL2在Windows 11上安装Kali Linux(含汉化与图形界面)

本文详细介绍了如何在Windows 11上通过WSL2安装和配置Kali Linux,包括汉化与图形界面设置。通过WSL2,用户可以享受接近原生性能的Linux体验,同时保持与Windows系统的无缝集成,特别适合网络安全爱好者和开发者。文章还提供了常见问题解决和性能优化建议,帮助用户高效使用Kali工具集。

weixin_42525369的博客 322

Android Java 线程池 ThreadPoolExecutor源码篇

线程池ThreadPoolExecutor源码分析,对线程池做一个深入的了解。

旧路 3245

RACECAR底层平台安装:Jetson Nano+ROS Melodic全栈部署指南

移动机器人开发中,底层平台安装是将硬件转化为可编程移动平台的关键起点。其核心在于嵌入式系统、ROS中间件与传感器驱动的深度协同——需兼顾内核模块加载、GPIO/PWM精确控制、I2C设备初始化及ROS工作空间构建等多层技术耦合。尤其在竞速级小车如RACECAR场景下,Jetson Nano的硬件加速能力、MPU6050 IMU固件加载、TB6612FNG电机驱动配置等细节,直接决定运动控制精度与实时性。本文聚焦Ubuntu 18.04 + ROS Melodic + JetPack 4.4.1技术栈,覆盖从

weixin_32025789的博客 255

Android 中使用 ThreadPoolExecutor

线程池执行器以及它们在 Android 中的使用。我们将通过大量示例代码彻底介绍这些主题。虽然现在我们都使用RxJava、Kotlin-Coroutines来执行后台任务,但了解 ThreadPoolExecutor 很重要,因为所有这些库都是在 ThreadPoolExecutor 之上构建的。线程池线程池管理一个工作线程池(具体数量取决于其实现)。任务队列保存等待池中...

qxf865618770的博客 1323

Ubuntu 24.04 安装 ROS2 Jazzy

手把手教你在Ubuntu24.04上安装JazzyROS2操作系统。

weixin_74185504的博客 1万+

手把手教你用Vivado的STARTUPE3原语驱动S25FL256S Flash(附完整Verilog代码)

本文详细介绍了如何利用Xilinx UltraScale+系列FPGA的STARTUPE3原语驱动S25FL256S SPI Flash,包括原语配置、SPI协议实现、状态机设计及调试技巧。通过完整的Verilog代码示例和性能优化建议,帮助开发者高效完成Flash通信解决方案的开发与集成。

weixin_30660027的博客 460

Android多线程——线程池ThreadPoolExecutor详解及使用

Android线程池详解前言ThreadPoolExecutor线程池的分类FixedThreadPoolCachedThreadPoolScheduledThreadPoolSingleThreadExecutor基本使用 前言 在开发中经常会使用到线程来进行异步操作,但是每个线程的创建和销毁都需要一定的开销。所以就需要线程池来对线程进行管理。Android中的线程池来源于Java中的Execu...

3031

VBA一键汇总多个工作簿-名称相同的工作表-的指定区域数据

VBA一键汇总多个工作簿-名称相同的工作表-的指定区域数据 日常工作,我们经常需要汇总相同格式的工作簿的某个工作表的数据 如1月业绩、2月业绩。。。。12月业绩等 姓名 数量 数据22 22 数据23 23 数据24 24 数据25 25 数据26 26 数据27 27 数据28 28 数据29 29 数据30 30 数据31 31 数据32 32 数据33 33 数据34

陈表达的博客 5981

Android开发—ThreadPoolExecutor与自定义线程池

1、ThreadPoolExecutor作为java.util.concurrent包对外提供基础实现,以内部线程池的形式对外提供管理任务执行,线程调度,线程池管理等等服务; 2、Executors方法提供的线程服务,都是通过参数设置来实现不同的线程池机制。 3、先来了解其线程池管理的机制,有助于正确使用,避免错误使用导致严重故障。同时可以根据自己的需求实现自己的线程池

嘴巴吃糖了 646

告别玄学:手把手配置EtherCAT从站PDI接口与同步采样(含Sync/Latch信号实战)

本文详细解析了EtherCAT从站PDI接口配置与同步采样技术,涵盖微处理器通信与直接驱动IO模式选择、同步采样四大触发模式(SOF、Latch_in、Sync0/Sync1)及输出触发实战。通过伺服驱动器实例,帮助工程师突破配置难点,实现高精度同步控制,提升工业自动化系统性能。

weixin_30667649的博客 483

点云从入门到精通技术详解100篇-基于 CBCT 与口内扫描数据的牙齿点云配准

口扫生成的三维牙模型只包含牙冠结构,容易受到唾液、食物残留等杂质的干扰。像精度,但其扫描成本较高,在公立医院的普及率较低。此外,口扫探入式的体。完整、精确的牙齿信息,有助于医生更好地进行数字化辅助诊疗,提高手术的预。可以表示上颌骨、下颌骨、牙冠以及牙根的位置和形状,但其扫描分辨率较低,精配准前实现粗略的预配准来确定点云间的初始位置,为精配准提供良好的配准。该算法通过计算点对间的距离确定源点云中的某一点在目标点云中的对应。算两点之间的欧氏距离,运算量较大,而且由于算法只考虑点集间的距离而忽略。

getusushu的博客 1640

Android线程,线程池相关

1,首先4种线程池的介绍:      Java通过Executors提供四种线程池,分别为: ExecutorService cachedThreadPool= Executors.newCachedThreadPool()创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用 execute 将

496

内容审核与文本安全技术综述:检测、过滤与对齐

检测质量高度依赖数据。毒性/仇恨/冒犯语言检测领域形成了一批经典数据集,但它们的标签体系差异很大:例如 OLID(OffensEval)强调“是否冒犯—冒犯类型—目标对象”三层结构;HateXplain 在“hate/offensive/normal”三分类之外,还提供目标群体与人类标注的 rationale span;RealToxicityPrompts 则不做离散标签,而是用毒性分数来研究“模型续写时的毒性退化”。ACL 汇编。

nmdbbzcl的博客 1371

Android线程池的原理和实践总结

提纲 是什么(使用线程池的原因,线程池的定义,好处,线程池原理) 怎么用(常见的使用方式,以及各个参数的作用) 为什么(源码分析,设计模式分析) 关于原理在android中的部分应用,部分注意事项 引子(原因) 多线程技术: 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力 多线程的异步执行...

WHHGARSKY的博客 2635

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android AsyncTask简要分析

在Android中实现异步任务机制有两种方式,Handler和AsyncTask。请参考Handler的简要分析,本文重点从源码角度分析AsyncTask的大致流程。 一个异步任务的执行一般包括以下几个步骤: 1.execute(Params… params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。 2.onPreExecute(),在execute(Params…

feisongfeiqin的博客 390

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Android线程与线程池

引言 在Android中,几乎完全采用了Java中的线程机制。线程是最小的调度单位,在很多情况下为了使APP更加流程地运行,我们不可能将很多事情都放在主线程上执行,这样会造成严重卡顿(ANR),那么这些事情应该交给子线程去做,但对于一个系统而言,创建、销毁、调度线程的过程是需要开销的,所以我们并不能无限量地开启线程,那么对线程的了解就变得尤为重要了。 Thread/Runnable/Callab...

weixin_34151004的博客 86

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java&Android开发笔记:线程池和异步任务AysncTask

说到线程池,就不得不提到阻塞队列,这是一种特殊的队列,是用于线程池内部的工作队列。如图所示,阻塞队列常用于生产者-消费者模式。生产者在队列尾部放入数据,消费者从队列头部消费数据。具体对应到线程池来说,生产者将Runnable 或者 Callable 对象放入工作队列中,然后消费者将这些任务取出并在子线程中执行。

Tai_Monster的博客 555

Android多线程:深入AsyncTask原理及源码分析

前言 AsyncTask在Android开发中是十分常见的 今天,我将全面讲解AsyncTask的源码,希望你们会喜欢 请先看文章:Android 多线程:AsyncTask最详细使用教程 目录 1. 简介 更详细了解,请看文章:Android 多线程:AsyncTask最详细使用教程 本文主要讲解其工作原理 &amp; 源码分析 2....

Carson带你学Android 7261

【转载】Android应用AsyncTask处理机制详解及源码分析

【工匠若水 http://blog.youkuaiyun.com/yanbober 转载烦请注明出处,尊重分享成果】 1 背景 Android异步处理机制一直都是Android的一个核心,也是应用工程师面试的一个知识点。前面我们分析了Handler异步机制原理(不了解的可以阅读我的《Android异步消息处理机制详解及源码分析》文章),这里继续分析Android的另一个异步机制AsyncTask的...

weixin_30300225的博客 67

ThreadPoolExecutor源码分析

ThreadPoolExecutor源码分析简介四种拒绝策略线程池的状态提交任务终止线程池(shutdown)立即终止线程池(shutdownNow) 简介 ExecutorService主要使用线程池中的可用线程执行提交的任务,主要用于解决两个不同的问题:执行大量异步任务时改善性能和管理资源。 四种拒绝策略 ThreadPoolExecutor.AbortPolicy: 丢弃任务,并抛出Rej...

等风 316

AsyncTask源码分析

此文章从源码和方面分析AsyncTask,具体使用和内存泄漏不做分析,网上关于使用方法一搜一大堆,不在赘述。 1、AsyncTask作为一个android中实现多线程常见的方法,定义如下: 一个Android已封装好的轻量级异步类 属于抽象类,即使用时需 实现子类 2、话不多说,直接上源码 public abstract class AsyncTask<Params, Progress, Result> { private static final String LOG_TA.

小白成长记 2632

Android AsyncTask 完美解析 看不懂源码你就输了

android.os.AsyncTask,一个执行异步操作的类,我们可以使用它来处理后台任务,并且在UI线程中处理结果,而无需关心线程的问题。 AsyncTask 内部是使用 {@link Thread}和{@link Handler}来实现的。 第一部分做简单介绍,第二部分介绍基本使用,第三部分做源码分析,一步步的深入代码,明白其背后的实现

JM_beizi的专栏 4207

Android - 源码 - AsyncTask

AsyncTask是Android系统提供的一个轻量级的异步类,我们可以通过继承AsyncTask来实现异步操作。 而且,AsyncTask还能反馈当前异步操作的执行进度,所以AsyncTask非常适合于更新UI。 一、AsyncTask的使用 AsyncTask是一个抽象类,所以我们必须要创建一个子类去继承AsyncTask。 在继承时,需要为AsyncTask类指定三个泛型参数

ZeroLhp的博客 362

Android源码分析—带你认识不一样的AsyncTask

Android源码分析—带你认识不一样的AsyncTask

qq_43661383的博客 121
上一篇: Java和Android的Thread源码分析
下一篇: HTTP协议格式和header、交互过程
豪豪6
博客等级 码龄14年 6粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值