zoukankan      html  css  js  c++  java
  • 线程池

    类似于一个池子,可以存放/管理线程

      常见线程池
                ①newSingleThreadExecutor

        单个线程的线程池,即线程池中每次只有一个线程工作,单线程串行执行任务
       ②newFixedThreadExecutor(n)
        固定数量的线程池,没提交一个任务就是一个线程,直到达到线程池的最大数量,然后后面进入等待队列直到前面的任务完成才继续执行
       ③newCacheThreadExecutor(推荐使用)
        可缓存线程池,当线程池大小超过了处理任务所需的线程,那么就会回收部分空闲(一般是60秒无执行)的线程,当有任务来时,又智能的添加新线程来执行。
       ④newScheduleThreadExecutor
        大小无限制的线程池,支持定时和周期性的执行线程
     

      线程池流程


                1.使用线程池的好处
                    第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
                    第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
                    第三:提高线程的可管理性
                    
                2.如何使用线程池
                    2.1线程池分类
                        线程池顶级类ThreadPoolExecutor最终实现Executor接口,在JUC包下,通过Executors类可以创建不同类型的线程池,分类如下
                            1.newScheduledThreadPool 定时任务线程池,可以设置任务时间
                            2.newFixedThreadPool 定长线程池
                            3.newSingleThreadExecutor 利用的是单线程,单线程处理任务,一般不用
                            4.newCachedThreadPool 带缓存的线程池
                    2.2 构建线程池
                        1.newCachedThreadPool线程池,可缓存,可以重复利用

                            //构建一个线程池,可以重复利用线程
                            ExecutorService executorService = Executors.newCachedThreadPool();
                            for (int i = 1; i <=10 ; i++) {
                                //创建线程池
                                executorService.execute(()->{
                                    System.out.println("创建线程池"+Thread.currentThread().getName());
                                });
                            }


                        2.newFixedThreadPool创建一个固定线程数量的线程池

                            //构建线程池对象
                            ExecutorService executorService = Executors.newFixedThreadPool(3);
                            for (int i = 0; i < 10; i++) {
                                //创建线程
                                executorService.execute(()->{
                                    System.out.println("创建线程:"+Thread.currentThread().getName());
                                });
                            }


                        3.newScheduledThreadPool

                            //创建一个线程池
                            ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3);
                            for (int i = 0; i < 10; i++) {
                                scheduledExecutorService.schedule(()->{
                                    System.out.println("创建线程:"+Thread.currentThread().getName());
                                },1000, TimeUnit.MILLISECONDS);
                            }


                        4.newSingleThreadExecutor单线程池

                            //创建一个线程池
                            ExecutorService executorService = Executors.newSingleThreadExecutor();
                            for (int i = 0; i < 10; i++) {
                                executorService.execute(()->{
                                    System.out.println("创建线程:"+Thread.currentThread().getName());
                                });
                            }


                        
                    
                3.所有的线程池分类底层调用的都是ThreadPoolExecutor()构造方法,该构造方法中每一个参数含义
                    public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue)
                        
                        1.corePoolSize代表核心线程池大小,当有任务时,会创建对应线程处理对应任务,当线程到达一定数量后,则会缓存到队列当中,不会再次创建新的线程
                        2.maximumPoolSize: 线程池最大线程数,它表示在线程池中最多能创建多少个线程
                        3.keepAliveTime: 表示线程没有任务执行时最多保持多久时间会终止。
                        4.unit: 参数keepAliveTime的时间单位,有7种取值,在TimeUnit类中有7种静态属性
                    
                4.如何确定线程池中创建线程数量
                    考虑CPU密集和IO密集,如果不考虑IO情况下,一般是处理器数量+1,如果考虑IO,则处理器*2

  • 相关阅读:
    EasyUI treegrid 加载checked
    html 文字垂直居中
    SQLSERVER 2008 查询数据字段名类型
    EasyUI TreeJson
    win7 网站发布备注
    LVS Nginx HAProxy 优缺点
    快速安装laravel和依赖
    Whoops, looks like something went wrong
    View.findViewById()和Activity.findViewById()区别
    ListView下拉刷新,上拉自动加载更多
  • 原文地址:https://www.cnblogs.com/chx9832/p/12524903.html
Copyright © 2011-2022 走看看