频道栏目
首页 > 资讯 > Java > 正文

Java架构学习之线程池使用讲解

18-07-27        来源:[db:作者]  
收藏   我要投稿

一、线程池

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:2018年7月24日 下午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:2018年7月24日 下午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:2018年7月24日 下午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:2018年7月24日 下午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()方法。

五、线程池原理分析

面试的时候主要谈:核心线程池、最大线程数。
相关TAG标签
上一篇:Java架构学习之jason、fastjson解析、xml使用、dom4j解析、java反射机制及手写SpringIOC框架实例讲解
下一篇:LaTeX新人教程,30分钟从完全陌生到基本入门
相关文章
图文推荐

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

版权所有: 红黑联盟--致力于做实用的IT技术学习网站