<dfn id='AgGzr5eu'></dfn>

        <noscript id='AgGzr5eu'></noscript>

      1. 频道栏目
        首页 > 程序开发 > 软件开发 > Java > 正文
        Java架构学习之线程池使用讲解
        2019-02-19 13:52:19         来源:Leeue李月  
        收藏   我要投稿

        一、线程池

        1、什么是线程池?
        答:
            经常创建、启动销毁一个线程都是非常消耗时间的。
            使用线程池进行管理和复用线程,提高程序效率。
        
        面试答:
        Java线程池能带来的3个好处:
         1、降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
         2、提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
         3、提高线程的可管理性。线程是稀缺资源,如果无限制地创建,
         不仅会消耗系统资源;够峤档拖低车奈榷ㄐ。
         使用线程池可以统一分配、调优和监控,但是要合理利用。
        
        Java使用线程核心走的是ThreadPoolExecutor。(构造函数)
        

        二、使用线程池的方式

        使用线程池的方式:
        使用Executor 封装好的四种线程池类型。
        1、newCachodThreadPool创建一个可以缓存线程池,如果线程池长度超过处理需要
        ,可灵活回收空闲线程,若无可回收,则新建线程。
        2、newFixedThreadPool 创建一个定长的线程池。可控制线程最大并发数,超出的
        线程会在队列中等待。
        3、newFixedThreadPool 创建一个定长的线程池。
        4、newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作
        线程来执行任务。
        

        三、线程池合理配置

        CPU密集、IO密集。
        

        四、4种创建线程池的方式

        newCachedThreadPool 创建可以缓存的线程池

        代码:

        package com.leeue;
        import java.util.concurrent.ExecutorService;
        import java.util.concurrent.Executors;
        
        /**
         * @classDesc: 功能描述:(线程池四种创建方式 newCachedThreadPool 创建可缓存的线程池)
         * @author:
         * @Version:v1.0
         * @createTime:2019年02月19日 下午2:56:16
         */
        public class NewCachedThreadPoolDemo {
            public static void main(String[] args) {
                // 1、创建可缓存的线程池 可以重复的利用
                ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
                for (int i = 0; i < 10; i++) {
                    int temp = i;
                    newCachedThreadPool.execute(new Runnable() {
                        @Override
                        public void run() {
                            System.out.println("ThreadName:" + Thread.currentThread().getName() + " i:" + temp);
                        }
                    });
                }
            }
        }
        显示结果:本来程序是创建10个线程,这里就创建了7个,说明有3个在复用
        

        这里写图片描述

        newFixedThreadPool:创建固定长度的线程池

        代码:
        
        package com.leeue;
        
        import java.util.concurrent.ExecutorService;
        import java.util.concurrent.Executors;
        
        /**
         * 
         * @classDesc: 功能描述:(可固定长度的线程池  newFixedThreadPool)
         * @author:李月
         * @Version:v1.0
         * @createTime:2019年02月19日 下午3:23:49
         */
        public class newFixedThreadPoolDemo {
            public static void main(String[] args) {
                //快捷键 ctrl+2 +F 来创建变量名
                ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(3);
                for(int i = 0; i < 10; i++) {
                    int temp = i;
                    newFixedThreadPool.execute(new Runnable() {
        
                        @Override
                        public void run() {
                        System.out.println("ThreadName:"+Thread.currentThread().getName()+" i:"+temp);  
                        }
                    });
                }
        
            }
        }
        显示效果:
        

        这里写图片描述

        newScheduledThreadPool:创建可以定时执行的线程池

        代码执行:
        
        package com.leeue;
        
        import java.util.concurrent.Executors;
        import java.util.concurrent.ScheduledExecutorService;
        import java.util.concurrent.TimeUnit;
        
        /**
         * 
         * @classDesc: 功能描述:(创建 可定时的线程池)
         * @author:
         * @Version:v1.0
         * @createTime:2019年02月19日 下午3:40:54
         */
        public class NewScheduledThreadPoolDemo {
            public static void main(String[] args) {
                ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(3);
                for(int i = 0; i < 10; i++) {
                    int temp = i;
                    newScheduledThreadPool.schedule(new Runnable() {
        
                        @Override
                        public void run() {
                            System.out.println("ThreadName:"+Thread.currentThread().getName()+" i:"+temp);  
        
                        }
                    }, 3, TimeUnit.SECONDS);//定时3秒后 执行这个线程池
                }
            }
        }
        
        显示效果:
        

        这里写图片描述

        newSingleThreadExecutor:单线程池

        代码:
        
        package com.leeue;
        
        import java.util.concurrent.ExecutorService;
        import java.util.concurrent.Executors;
        
        /**
         * 
         * @classDesc: 功能描述:(单线程的线程池)
         * @author:
         * @Version:v1.0
         * @createTime:2019年02月19日 下午3:57:15
         */
        public class NewSingleThreadScheduledDemo {
            public static void main(String[] args) {
                ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();
                for (int i = 0; i < 10; i++) {
                    int temp = i;
                    newSingleThreadExecutor.execute(new Runnable() {
        
                        @Override
                        public void run() {
                            System.out.println("ThreadName:" + Thread.currentThread().getName() + " i:" + temp);
                        }
                    });
                }
            }
        }
        
        显示效果
        

        这里写图片描述

        停掉线程池的方法newSingleThreadExecutor.shutdown();//停掉线程池的方法

        调用shoutdown()方法。
        

        五、线程池原理分析

        面试的时候主要谈:核心线程池、最大线程数。
        
        点击复制链接 与好友分享!回本站首页
        上一篇:java.lang.NoSuchMethodError: org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnn报错解决办法
        下一篇:Java架构学习之jason、fastjson解析、xml使用、dom4j解析、java反射机制及手写SpringIOC框架实例讲解
        相关文章
        图文推荐
        点击排行

        关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

        版权所有: 第一门户--致力于做实用的IT技术学习网站