精华内容
下载资源
问答
  • 线程池以及四种常见线程池 public ThreadPoolExecutor(int corePoolSize,//核心线程池大小,核心线程将会尽可能地一直活着 int maximumPoolSize,//线程池最大数量包括核心线程数量 long keepAliveTime,//非核心...

    线程池以及四种常见线程池

    public ThreadPoolExecutor(int corePoolSize,//核心线程池大小,核心线程将会尽可能地一直活着
                              int maximumPoolSize,//线程池最大数量包括核心线程数量
                              long keepAliveTime,//非核心线程最长存活时间
                              TimeUnit unit,//keepAliveTime的单位
                              BlockingQueue<Runnable> workQueue,//等待线程的队列
                              ThreadFactory threadFactory,//线程工程
                              RejectedExecutionHandler handler)//线程拒绝执行回调
    复制代码

    四种常见的线程池:

    • Executors.newCachedThreadPool()

      new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                        60L, TimeUnit.SECONDS,
                                        new SynchronousQueue<Runnable>())
      复制代码
    • Executors.newFixedThreadPool(int nThreads)

      new ThreadPoolExecutor(nThreads, nThreads,
                                        0L, TimeUnit.MILLISECONDS,
                                        new LinkedBlockingQueue<Runnable>())
      复制代码
    • Executors.newScheduledThreadPool(int nCorepoolSize)

      public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
          return new ScheduledThreadPoolExecutor(corePoolSize);
      }
      
      //ScheduledThreadPoolExecutor():
      public ScheduledThreadPoolExecutor(int corePoolSize) {
          super(corePoolSize, Integer.MAX_VALUE,
                DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS,
                new DelayedWorkQueue());
      }
      复制代码

    • Executors.newSingleThreadPool()

      public static ExecutorService newSingleThreadExecutor() {
          return new FinalizableDelegatedExecutorService
              (new ThreadPoolExecutor(1, 1,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>()));
      }
      复制代码

    转载于:https://juejin.im/post/5b690c33e51d4518f5444d81

    展开全文
  • Java 四种常见线程池解析

    千次阅读 2018-10-05 15:56:55
    目录四种常见线程池ThreadPoolExecutorFixedThreadPoolChachedThreadPoolSingleThreadExecutorScheduledThreadPool 四种常见线程池 线程池用于管理线程的创建与销毁,避免无用线程造成资源浪费,当需要创建多个...


    四种常见线程池


      线程池用于管理线程的创建与销毁,避免无用线程造成资源浪费,当需要创建多个线程时,我们往往需要一个管理者来管理这些线程,这也就引入了线程池的概念.Android中有四种较为常见的线程池也是我们使用最广泛的线程池,FixedThreadPool(固定线程数的线程池),ChachedThreadPool(缓存型线程池),SingleThreadExecutor(单线程线程池),ScheduledThreadPool(周期性调度线程池).这几种线程池本质都是通过ThreadPoolExecutor来创建的.当然在使用中我们只需要通过Executors就能快速创建这几类线程池,但是我们需要理解其创建的具体流程.



    线程池工作流程




    ThreadPoolExecutor

      这四种常见线程池创建的本质都是通过ThreadPoolExecutor来创建的,只是传入的参数不同就生成了不同的线程池,所以我们需要学习ThreadPoolExecutor的构造方法,这样我们就可以创建出符合我们需求的线程池了.

    ThreadPoolExecutor的重要属性

    • corePoolSize:核心线程数,默认情况线程池为空,只有在提交任务后,才会创建新的线程去执行任务,当正在运行的线程数少于核心线程数时,则创建新线程来执行任务;如果等于或者多于核心线程数,则不再创建.如果使用prestartAllcoreThread方法,则会提前创建线程填满线程池,等待任务.
    • maximumPoolSize:线程池允许创建的最大线程数(包括核心线程与非核心线程),如果任务队列已经满了,但是小于maximumPoolSize,仍然可以创建非核心线程来执行任务.
    • keepAliveTime:非核心线程的闲置时间,非核心线程一旦存活时间超过keepAliveTime则会被回收,如果有很多重复任务则可以提高keepAliveTime来保证线程的重复利用率,如果设置了allowCoreThreadTimeOut属性为true.
    • TimeUtil:keepAliveTime的单位,包含天,时,分,秒,毫秒等.
    • WorkQueue:任务队列,这是一个阻塞队列.
    • ThreadFactory:线程工厂,通过线程工厂可以为线程取名,一般无需使用.
    • RejectedExecutionHandler:饱和策略,当任务和线程池都满了时采用的处理方法,默认为AbordPolicy策略表示无法处理新任务.



    饱和策略

      饱和策略就是当任务队列和线程池都已经满了的时候,有新任务进来时采用何种策略来处理新任务.

    • AbordPolicy:表示无法处理新任务
    • CallerRunsPolicy:通过调用者所在线程处理新任务.
    • DiscardPolicy:无法执行新任务,并删除该任务
    • DiscardOldestPolicy:丢弃队列最近的任务并执行该任务.


    FixedThreadPool


      FixedThreadPool的核心线程数和最大线程数都指定为同一值也就意味着,该线程池中只包含了核心线程,并且核心线程数量已经规定好了,其传入的keepAliveTime为0L表示,一旦任务执行完毕,线程空闲就会立即被回收.其传入的任务队列为LinkedBlockingQueue(无界阻塞队列即任务数量没有限制),如果线程多于核心线程数时,任务会被放入任务队列中,等待能创建新线程时再执行.

    使用中我们通过Excutors来创建FixedThreadPool

    Executors.newFixedThreadPool();
    

    FixedThreadPool创建源码

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


    ChachedThreadPool


      ChachedThreadPool线程池中核心线程数为0,其最大线程数为Integer.MAX_VALUE(即无界),这也意味着所有线程都为非核心线程,任务队列为SynchronousQueue(阻塞队列),当任务执行完毕后线程可以存活60秒来等待任务匹配,如果没有任务则被销毁,如果匹配上了任务,则提高了线程的重复利用率.该线程池适用于大量需要立即执行的任务且任务周期较短的任务.

    使用中我们通过Excutors来创建ChachedThreadPool

    Executors.newCachedThreadPool();
    

    ChachedThreadPool创建源码

    public static ExecutorService newCachedThreadPool() {
            return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                          60L, TimeUnit.SECONDS,
                                          new SynchronousQueue<Runnable>());
        }
    


    SingleThreadExecutor


      单线程池,该线程池中只存在一个核心线程,任务队列为LinkedBlockingQueue,即该线程池会把任务放入该无界阻塞队列中一个一个执行.

    使用中我们通过Excutors来创建SingleThreadExecutor

    Executors.newSingleThreadExecutor();
    

    SingleThreadExecutor创建源码

    public static ExecutorService newSingleThreadExecutor() {
            return new FinalizableDelegatedExecutorService
                (new ThreadPoolExecutor(1, 1,
                                        0L, TimeUnit.MILLISECONDS,
                                        new LinkedBlockingQueue<Runnable>()));
        }
    


    ScheduledThreadPool


      定时调度线程,该线程可以实现延时和周期性循环任务.具有固定的核心线程数以及无界的非核心线程数,任务队列为DelayedWorkQueue(延时队列),DelayedWorkQueue队列会将任务按照顺序排列,将先执行的任务放在队列前端.

    使用中我们通过Excutors来创建ScheduledThreadPool

    Executors.newScheduledThreadPool();
    

    ScheduledThreadPool创建源码

     public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
            return new ScheduledThreadPoolExecutor(corePoolSize);
        }
    

    ScheduledThreadPoolExecutor的构造方法
      这里调用了其super方法,其父类就是ThreadPoolExecutor,所以本质上ScheduledThreadPool也是通过ThreadPoolExecutor创建的.但是有一点不同ScheduledThreadPool的管理队列是一个延时队列,所以它可以定时调度线程.

    public ScheduledThreadPoolExecutor(int corePoolSize) {
            super(corePoolSize, Integer.MAX_VALUE,
                  DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS,
                  new DelayedWorkQueue());
        }
    

    展开全文
  • 常见线程池和启动定时器线程池 1.线程池的概念:线程池是一种多线程处理形式,处理过程中将任务添加到队列,如果线程池中有空闲的线程,则由该线程去完成这些任务。 2.Excecutors类的应用  (1)创建固定大小的...


    常见线程池和启动定时器线程池


    1.线程池的概念:线程池是一种多线程处理形式,处理过程中将任务添加到队列,如果线程池中有空闲的线程,则由该线程去完成这些任务。

    2.Excecutors类的应用

      (1)创建固定大小的线程池Executors.newFixedThreadPool(3); 

      (2)创建缓存线程池Executors.newCachedThreadPool(3)

    当任务扔进线程池中如果当前创建的线程不够来处理任务的话,就自动添加跟任务数量相等的线程。

      (3)创建单一线程池:Executors.newSingleThreadExecutor();

         跟创建单一线程并没有什么区别,但是它有一个好处,就是当这个线程死了以后,就会自动再创建一个替补线程。

     

    3.线程池结束线程的方法:shutdown();shutdownNow

       shutdown():

       shutdownNow():

     

    4.用线程池启动定时器

      (1)调用ScheduleExecutorServiceschedule方法,返回的ScheduleFuture对象可以取消任务。

      (2)支持间隔重复任务的定时方式,不直接支持绝对定时方式,需要转换成相对时间方式。

    注意:scheduleAtFixedRate()这个方法里并没有传入Date这个参数的方法。


    实例1:对三种常见线程池使用示例

    public class ThreadPoolTest {
    	public static void main(String[] args) {
    		
    		// TODO Auto-generated method stub
    	  //ExecutorService threadpool= Executors.newFixedThreadPool(3);
    		ExecutorService threadpool= Executors.newCachedThreadPool();
    	  
    		for(int i=1;i<=10;i++){
    			  final int task = i;
    			  threadpool.execute(
    				   new Runnable(){
    					   public void run(){
    						    for(int j=1;j<=10;j++){
    						    	try {
    									Thread.sleep(100);
    								} catch (InterruptedException e) {
    									// TODO Auto-generated catch block
    									e.printStackTrace();
    								}
    						    	System.out.println(Thread.currentThread().getName() + " is looping of " + j + " for  task of " + task);
    						    }
    					   }
    				   }
    				  );
    		}
    	}
    }



    实例2:对线程池指定的任务设置,延迟时间,和指定时间间隔
    		Executors.newScheduledThreadPool(3).scheduleAtFixedRate((new Runnable() {
    			@Override
    			public void run() {
    				System.out.println("bombing");
    			}
    		}), 10, 2,TimeUnit.SECONDS);






    展开全文
  • java中四种常见线程池

    2019-06-04 15:52:47
    java中四种常见线程池 Java通过Executors类提供四种线程池,我们查看源码可以知道,这四种线程池内部都是基于ThreadPoolExecutor类(Executor的子类)实现的。分别为: newCachedThreadPool 创建一个可缓存...

    java中四种常见线程池

    Java通过Executors类提供四种线程池,我们查看源码可以知道,这四种线程池内部都是基于ThreadPoolExecutor类(Executor的子类)实现的。分别为:

    1. newCachedThreadPool

      创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
      源码结构:
      在这里插入图片描述在这里插入图片描述在这里插入图片描述

    2. newFixedThreadPool

      创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
      源码结构:
      在这里插入图片描述在这里插入图片描述

    3. newScheduledThreadPool

      创建一个定长线程池,支持定时及周期性任务执行。
      在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

    4. newSingleThreadExecutor

      创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
      在这里插入图片描述

    5. 从上面的源码可知,创建线程池都使用到了ThreadPoolExecutor类,因此为了知道每种线程池的区别,我们需要对ThreadPoolExecutor类的构造方法的参数进行解读。首先我们定位到ThreadPoolExecutor类的构造方法。

    在这里插入图片描述参数解读:

    • corePoolSize:核心线程数(最小存活的工作线程数量);
    • maximumPoolSize:最大线程数;
    • keepAliveTime:线程存活时间(在corePoreSize<maximunPoolSize情况下有用,线程的空闲时间超过了keepAliveTime就会销毁);
    • unit:存活时间的时间单位;
    • workQueue:阻塞队列,用来保存等待被执行的任务,是一个接口对象,旗下有几个实现类为大家介绍一下:
      ①SynchronousQueue:这个队列比较特殊,它不会保存提交的任务,而是将直接新建一个线程来执行新来的任务;
      ②LinkedBlockingQueue:基于链表的先进先出队列,如果创建时没有指定此队列大小,则默认为Integer.MAX_VALUE;
      ③ArrayBlockingQueue:基于数组的先进先出队列,此队列创建时必须指定大小。
    • threadFactory:线程工厂,主要用来创建线程;
    • handler:表示当拒绝处理任务时的策略,有如下几种策略:
      ①丢弃任务并抛出RejectedExecutionException异常;
      ②丢弃任务,但是不抛出异常;
      ③丢弃队列最前面的任务,然后重新尝试执行任务;
      ④由调用线程处理该任务。
    1. 然后我们结合第五步的参数解读就可以知道这四种线程池的创建方式。

    ①可缓存线程池CachedThreadPool:
    在这里插入图片描述
    根据源码可以看出:
    这种线程池内部没有核心线程,线程的数量是没有限制的。
    在创建任务时,若有空闲的线程时则复用空闲的线程,若没有则新建线程。
    没有工作的线程(闲置状态)在超过了60S还不做事,就会销毁。
    适用:执行很多短期异步的小程序或者负载较轻的服务器。

    ②FixedThreadPool 定长线程池:

    在这里插入图片描述

    根据源码可以看出:
    该线程池的最大线程数等于核心线程数,所以在默认情况下,该线程池的线程不会因为闲置状态超时而被销毁。
    如果当前线程数小于核心线程数,并且也有闲置线程的时候提交了任务,这时也不会去复用之前的闲置线程,会创建新的线程去执行任务。如果当前执行任务数大于了核心线程数,大于的部分就会进入队列等待。等着有闲置的线程来执行这个任务。
    适用:执行长期的任务,性能好很多。

    ③SingleThreadPool 单线程线程池
    在这里插入图片描述根据源码可以看出:
    有且仅有一个工作线程执行任务
    所有任务按照指定顺序执行,即遵循队列的入队出队规则。
    适用:一个任务一个任务执行的场景。【如果只是一个线程那么其实没必要使用这种线程池】

    ④ScheduledThreadPool 定时任务线程池
    在这里插入图片描述在这里插入图片描述根据源码可以看出:
    这个线程池有点像是CachedThreadPool和FixedThreadPool 结合了一下。
    不仅设置了核心线程数,最大线程数也是Integer.MAX_VALUE。
    这个线程池是上述4个中唯一一个有延迟执行和周期执行任务的线程池。
    适用:周期性执行任务的场景(定期的同步数据)

    1. 总之,大家在实际工作中可以根据需要进行选择,采用合适的线程池来提高程序的效率。
    展开全文
  • 本文将讲解线程池参数、参数之间的关系以及线程池以一个怎么样的策略执行新增到线程池的线程,最后会举例常见线程池是怎么样应用这些参数和流程的。文章较长,可以根据目录选择想看的知识,若有错误请指出。 1....
  • 常见线程池 本质都是ThreadPoolExecutor 注意事项 常见线程池 a、newFixedThreadPool 创建一个固定长度的线程池,当到达线程最大数量时,线程池的规模将不再变化。 b、newCachedThreadPool 创建一个可...
  • 常见线程池种类

    千次阅读 2019-11-08 09:30:15
    创建固定线程数的线程池,使用的是LinkedBlockingQueue无界队列,线程池中实际线程数永远不会变化 适用于可以预测线程数量的业务中,或者服务器负载较重,对线程数有严格限制的场景 Executors....
  • 线程池 概念 线程池就是首先创建一些线程,他们的集合称为线程池,使用线程池可以很好的提高性能。 5种状态 ThreadPoolExecutor 使用int的高3位来表示线程池状态,低29位表示线程数量 状态名 高3位 说明 ...
  • java线程池原理 Executors类提供了FixedThreadPool、CachedThreadPool等线程池对象,都是基于ThreadPoolExecutor产生的。 Executor接口定义了execute(),子接口ExecutorService又定义了submit(),抽象类...
  • 什么是阻塞队列线程池的工作队列线程池执行流程几种常见线程池newFixedThreadPoolnewCachedThreadPoolnewSingleThreadExecutornewScheduledThreadPool底层原理参数简介饱和拒绝策略创建线程池什么是死锁手写一个...
  • Java常见线程池

    2019-02-16 14:14:43
    1. 为什么使用线程池 诸如 Web 服务器、数据库服务器、文件服务器或邮件服务器之类的许多服务器应用程序都面向处理来自某些远程来源的大量短小的任务。请求以某种方式到达服务器,这种方式可能是通过网络协议(例如 ...
  • Executors类创建四种常见线程池

    千次阅读 多人点赞 2019-10-14 09:45:18
    文章目录线程池架构newSingleThreadExecutornewFixedThreadPoolnewCachedThreadPoolnewScheduledThreadPoolExecutors和ThreaPoolExecutor创建线程池的区别两种提交任务的方法executesubmit 线程池架构 上图是线程池...
  • 传统的多线程缺点: 每次新建/销毁线程对象消耗资源、响应速度慢。 线程缺乏统一管理,容易出现阻塞的情况。...常见的4类线程池 Executor是一个接口,线程池中的真正实现者:ThreadPoolExecutor。 Androi...
  • 四种常见线程池介绍

    2019-08-01 17:16:40
    使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池线程池就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,...
  • 四种常见线程池

    2018-01-03 23:54:00
    //缓存线程池线程池的大小由jvm决定,如果有空闲线程会回收 Executors.newCachedThreadPool(); //单线程线程池,可保证任务执行的顺序就是任务提交的顺序 Executors.newSingleThreadExecutor(); //固定...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,568
精华内容 1,027
关键字:

常见线程池