• Android(Java)线程池:ExecutorService和Executors使用(一)


     ExecutorService是线程池的一个服务,可以随时关闭线程池,是继承Executor的。Executors是个工厂类,专门创建各种线程池。

    1. public interface ExecutorService extends Executor {  
    2.   
    3.     void shutdown();  
    4.   
    5.     List<Runnable> shutdownNow();  
    6.   
    7.     boolean isShutdown();  
    8.   
    9.     boolean isTerminated();  
    10.   
    11.     boolean awaitTermination(long timeout, TimeUnit unit)  
    12.   
    13.     <T> Future<T> submit(Callable<T> task);  
    14.   
    15.     <T> Future<T> submit(Runnable task, T result);  
    16.   
    17.     Future<?> submit(Runnable task);  
    18.   
    19.     <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)  
    20.   
    21.     <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)  
    22.   
    23.     <T> T invokeAny(Collection<? extends Callable<T>> tasks)  
    24.   
    25.     <T> T invokeAny(Collection<? extends Callable<T>> tasks,  
    26.                     long timeout, TimeUnit unit)  
    27. }  

    Excutor接口

         源码非常简单,只有一个execute(Runnable command)回调接口 

    public interface Executor {
    
        /**
         * Executes the given command at some time in the future.  The command
         * may execute in a new thread, in a pooled thread, or in the calling
         * thread, at the discretion of the <tt>Executor</tt> implementation.
         *
         * @param command the runnable task
         * @throws RejectedExecutionException if this task cannot be
         * accepted for execution.
         * @throws NullPointerException if command is null
         */
        void execute(Runnable command);
    }   

     new Thread的弊端:

     a. 每次new Thread新建对象性能差。

     b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。

     c. 缺乏更多功能,如定时执行、定期执行、线程中断。

     相比new Thread,Java提供的四种线程池的好处在于:

     a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。

     b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。

     c. 提供定时执行、定期执行、单线程、并发数控制等功能。

    Java通过Executors提供四种线程池,分别为:

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

    1. newFixedThreadPool
    创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。在任意点,在大多数 nThreads 线程会处于处理任务的活动状态。如果在所有线程处于活动状态时提交附加任务,则在有可用线程之前,附加任务将在队列中等待。如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务(如果需要)。在某个线程被显式地关闭之前,池中的线程将一直存在。 
    -newFixedThreadPool与cacheThreadPool差不多,也是能reuse就用,但不能随时建新的线程 
    -其独特之处:任意时间点,最多只能有固定数目的活动线程存在,此时如果有新的线程要建立,只能放在另外的队列中等待,直到当前的线程中某个线程终止直接被移出池子 
    -和cacheThreadPool不同,FixedThreadPool没有IDLE机制(可能也有,但既然文档没提,肯定非常长,类似依赖上层的TCP或UDP IDLE机制之类的),所以FixedThreadPool多数针对一些很稳定很固定的正规并发线程,多用于服务器 
    -从方法的源代码看,cache池和fixed 池调用的是同一个底层池,只不过参数不同: 
    fixed池线程数固定,并且是0秒IDLE(无IDLE) 
    cache池线程数支持0-Integer.MAX_VALUE(显然完全没考虑主机的资源承受能力),60秒IDLE  

    2. newCachedThreadPool
    创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用 execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。注意,可以使用 ThreadPoolExecutor 构造方法创建具有类似属性但细节不同(例如超时参数)的线程池。
    -缓存型池子,先查看池中有没有以前建立的线程,如果有,就reuse.如果没有,就建一个新的线程加入池中 
    -缓存型池子通常用于执行一些生存期很短的异步型任务 
    因此在一些面向连接的daemon型SERVER中用得不多。 
    -能reuse的线程,必须是timeout IDLE内的池中线程,缺省timeout是60s,超过这个IDLE时长,线程实例将被终止及移出池。 
      注意,放入CachedThreadPool的线程不必担心其结束,超过TIMEOUT不活动,其会自动被终止。

    3. newSingleThreadExecutor
    创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程将代替它执行后续的任务)。可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。与其他等效的 newFixedThreadPool(1) 不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。
    -单例线程,任意时间池中只能有一个线程 
    -用的是和cache池和fixed池相同的底层池,但线程数目是1-1,0秒IDLE(无IDLE)

    4.newScheduledThreadPool 
    -调度型线程池 
    -这个池子里的线程可以按schedule依次delay执行,或周期执行

    来源:

    1.http://www.linuxidc.com/Linux/2012-05/61591.htm

    2.http://www.shangxueba.com/jingyan/1855402.html

    3.http://www.xuebuyuan.com/1288080.html

  • 相关阅读:
    Spring 循环依赖的三种方式(三级缓存解决Set循环依赖问题)
    终于有人把“TCC分布式事务”实现原理讲明白了
    Java synchronized 关键字的实现原理
    Synchronized的实现原理(汇总)
    Spring的Bean的生命周期(大众版)
    Synchronized与Lock的区别与应用场景
    Lock与synchronized 的区别
    线程的同步控制synchronized和lock的对比和区别
    lock和synchronized的同步区别与选择
    Mybatis3.x与Spring4.x整合
  • 原文地址:https://www.cnblogs.com/Android9527/p/5406810.html
Copyright © 2020-2023  润新知