Android并发之Executor(线程池)家族(一)

        线程池在移动端开发过程中,在提高性能、充分利用GPU方面,有着不错的表现。Executor是个比较庞大的家族,Executor的子孙众多。常用的ThreadPoolExecutorFixedThreadPool、CachedThreadPool、ScheduledThreadPool、SingleThreadExecutor等。

        Executor是只有一个void execute(Runnable command)为实现的方法的接口类,是实现Android并发编程线程池框架的基础。

ExecutorService

        先看下ExecutorService类,这个是Executor的二级接口类,也只是个接口。具有有序的关闭池中线程的功能,一定执行,不再接受其他的线程加入。也可以等待所有的都执行完毕,在处理,但比较危险。

这里写图片描述

 盗图(不完整)

        从图中看出,ExecutorService接口类是ThreadPoolExecutor和ScheduledExecutor的基础。ForkJoinPool类和ThreadPoolExecutor一样,都是AbstractExecutorService的子类。ForkJoinPool是1.7版本加入进来的。上面的图并没有体现。

1、ForkJoinPool

        ForkJoinPool是为了特使的场景而生的,具体看看作者的论文。很强大。

ForkJoinPool的作者Doug Lea 关于java Fork/Join框架的论文

        ForkJoinPool采用的分治算法,和归并排序算法类似,就是将任务切割到最小。

2、ThreadPoolExecutor

        ThreadPoolExecutor是用的最多的一个线程池,在较多线程开发时,ThreadPoolExecutor控制好线程的可调度资源、并发线程数量。ThreadPoolExecutor的用法,分享个链接。

java线程池ThreadPoolExecutor类使用详解

         这里,我不讲如何使用,我想从源码角度分析,线程是如何维护的。

        a、列队

        既然是池子,那说明里面维护的线程绝不可能永远只有一个,那线程都在哪里?当然就是列队。有PriorityQueue优先级列队、内部含有PriorityQueue(优先级)的DelayQueue延时列队、数组结构的PriorityBlockingQueue优先级阻塞列队、单链表结构的LinkedBlockingQueue无界阻塞列队、数组结构的ArrayBlockingQueue有界阻塞列队,当然,还有LinkedBlockingDeque双向链表阻塞列队。具体使用哪个列队承载线程,视情况而定即可。

        这些列队,都实现了迭代器和分割器,因为都是非线程安全的,请善用。由于列队种类过对,这里我不就针对每一个进行分析下,在使用线程池的时候,知道原理以及特性,也是有助于更好使用线程池的。

        PriorityQueue:

        原理:默认情况下,他是个有默认排序的列队的排序,也可以传入一个Comparable比较器,对列队进行排序。PriorityQueue内部列队,是使用数组承载的。

        代码解析:添加元素。

    // 添加元素
    public boolean add(E e) {
        return offer(e);
    }
    ...
    // 将元素添加到有序的优先级列队中。
    public boolean offer(E e) {
        if (e =
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,可以使用配置类来配置Executor线程池。其中,常用的实现类是`ExecutorService`和`ThreadPoolTaskExecutor`。 首先,需要创建一个配置类,可以命名为`ThreadPoolConfig`或者其他你喜欢的名称。在这个类中,你需要使用`@Configuration`注解来标识它是一个配置类,并且使用`@EnableAsync`注解来启用异步执行。 接下来,你需要定义一个`ExecutorService`或`ThreadPoolTaskExecutor` Bean,并使用`@Bean`注解将其标识为一个Bean。你可以根据项目的需求来选择使用哪个实现类。 如果选择使用`ExecutorService`,可以按照以下方式配置: ```java @Configuration @EnableAsync public class ThreadPoolConfig { @Bean public ExecutorService executorService() { return Executors.newFixedThreadPool(10); // 配置线程池的大小 } } ``` 如果选择使用`ThreadPoolTaskExecutor`,可以按照以下方式配置: ```java @Configuration @EnableAsync public class ThreadPoolConfig { @Bean public ThreadPoolTaskExecutor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(10); // 设置核心线程数 executor.setMaxPoolSize(20); // 设置最大线程数 executor.setQueueCapacity(30); // 设置队列容量 executor.setThreadNamePrefix("my-executor-"); // 设置线程名称前缀 executor.initialize(); // 初始化 return executor; } } ``` 在上述配置中,你可以根据实际需求来设置线程池的大小、队列容量等参数。通过这种方式,你就可以在应用程序中注入`ExecutorService`或`ThreadPoolTaskExecutor`,并使用它来执行异步任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值