java

您所在的位置:网站首页 安卓线程池参数 java

java

2024-07-16 05:35| 来源: 网络整理| 查看: 265

前言

在《阿里巴巴Android开发手册》里面有这样几句话:

【强制】新建线程时,必须通过线程池提供(AsyncTask 或者ThreadPoolExecutor或者其他形式自定义的线程池),不允许在应用中自行显式创建线程。 【强制】线程池不允许使用Executors 去创建,而是通过ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。

很多时候为了省事用的都是Executors的方式去创建,感觉也没什么问题,不过阿里工程师的推荐自然是有道理的,以后还是尽量改用ThreadPoolExecutor的方式来创建吧,不过使用ThreadPoolExecutor方式来创建时,需要传入的参数很多,为了加深记忆,这里就简记录一下。

为什么要引入线程池

平时在Android开发的过程中经常会用到多线程异步处理相关任务,每开一个线程都要新建一个Thread对象来处理,这种操作会造成哪些后果呢?

系统执行多任务时,会为每个任务创建对应的线程,当任务执行结束之后会销毁对应的线程,在这种情况下对象被频繁的创建和销毁。当对线程象被频繁时会占用大量的系统资源,在并发的过程中会造成资源竞争出现问题。大量的创建线程还会造成混乱,没有一个统一的管理机制,容易造成应用卡顿。大量线程对象被频繁销毁,将会频繁出发GC机制,从而降低性能。引入线程池的好处:重用线程池中的线程,避免因频繁创建和销毁线程造成的性能消耗。更加有效的控制线程的最大并发数,防止线程过多抢占资源造成的系统阻塞。对线程进行有效的管理。ThreadPoolExecutor的参数解析线程池构造函数:代码语言:java复制public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { if (corePoolSize < 0 || maximumPoolSize =corePoolSize,则每来一个任务,会尝试将其添加到该队列当中,注意只要超过了 corePoolSize 就会把任务添加到该缓存队列,添加可能成功也可能不成功,如果成功的话就会等待空闲线程去执行该任务,若添加失败(一般是队列已满),就会根据当前线程池的状态决定如何处理该任务(若线程数 < maximumPoolSize 则新建线程;若线程数 >= maximumPoolSize,则会根据拒绝策略做具体处理)。

常用的阻塞队列有:

代码语言:java复制//基于数组的先进先出队列,此队列创建时必须指定大小; 1)ArrayBlockingQueue   //基于链表的先进先出队列,如果创建时没有指定此队列大小,则默认为Integer.MAX_VALUE;  2)LinkedBlockingQueue  //这个队列比较特殊,它不会保存提交的任务,而是将直接新建一个线程来执行新来的任务。  3)synchronousQueue    threadFactory:线程工厂

用来为线程池创建线程,当我们不指定线程工厂时,线程池内部会调用Executors.defaultThreadFactory()创建默认的线程工厂,其后续创建的线程优先级都是Thread.NORM_PRIORITY。如果我们指定线程工厂,我们可以对产生的线程进行一定的操作。

handler:拒绝执行策略

当线程池的缓存队列已满并且线程池中的线程数目达到maximumPoolSize,如果还有任务到来就会采取任务拒绝策略,通常有以下四种策略:

代码语言:java复制ThreadPoolExecutor.AbortPolicy:       // 丢弃任务并抛出RejectedExecutionException异常。 ThreadPoolExecutor.DiscardPolicy:      // 也是丢弃任务,但是不抛出异常。 ThreadPoolExecutor.DiscardOldestPolicy:  // 丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程) ThreadPoolExecutor.CallerRunsPolicy:    // 由调用线程处理该任务


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3