【JavaEE精炼宝库】多线程(6)线程池

目录

一、线程池的概念及优势

1.1 线程池的概念:

1.2 线程池的优势:

二、工厂模式

三、标准库中的线程池

3.1 标准库线程池参数解释:

3.1.1 corePoolSize | maximumPoolSize:

3.1.2 keepAliveTime | unit:

3.1.3 workQueue: 

3.1.4 ThreadFactory: 

3.1.5 handler:

3.2 创建线程池演示:

3.3 利用线程池的工厂类来创建线程池:

3.4 线程池的使用演示:

四、线程池的实现


一、线程池的概念及优势

1.1 线程池的概念:

线程池是一种并发编程的技术,它维护着一组预先创建的线程,以便在需要时重用它们来执行多个任务。这可以提高程序的性能和效率,因为线程的创建和销毁通常是昂贵的操作,通过重用线程,可以减少这种开销。

在我们前面已经介绍了线程比进程更加轻量,在频繁创建销毁的时候,线程更有优势。但是随着时代的发展,对于 “频繁” 有了新的定义(比如之前 1 万就认为是频繁,但是现在可能 1000 万才认为是频繁)。即使是线程,在如此频繁的创建和销毁的情况下,开销也变得难以接受。

那么要怎么优化呢?

答:我们可以通过线程池和协程进行优化。

协程这里我们暂且不进行描述,Go 语言主打的卖点就是使用协程处理并发编程。线程池的优化我们马上讲到。

1.2 线程池的优势:

• 降低资源消耗:

减少线程的创建和销毁带来的性能开销。

• 提高响应速度:

当任务来时可以直接使用,不用等待线程创建

• 可管理性:

进行统一的分配,监控,避免大量的线程间因互相抢占系统资源导致的阻塞现象。

二、工厂模式

在下面即将介绍的线程池参数中,其中有一个参数是工厂类。所以在这里提前给大家解释一下什么是工厂模式。

工厂模式:也是一种设计模式,主要解决的问题是构造方法创建对象太坑了的问题。为什么说构造方法创建对象有坑呢?举个栗子:

因为在 Java 的语法中要求构造方法的命名必须是类名且参数类型和个数,排列顺序不能一样。这就导致遇到上面这种案例解决不了。就需要工厂模式,核心思路,不使用构造方法创建对象,给构造方法包装一层。例如下面这段代码:这只是个伪代码,看看思路就行,makePointByXY 这样的方法就叫 “工厂方法”,这样写代码的套路就叫做 “工厂模式”,没有什么特别的。

public class Point {
    public static Point makePointByXY(double x,double y){
        Point p = new Point();
        p.setX(x);//和 setR 是有区别的,比如传给的函数不一样
        p.setY(y);
        return p;
    }
    public static Point makePointByRA(double r,double a){
        Point p = new Point();
        p.setR(r);
        p.setA(a);
        return p;
    }
}

工厂类的写法如下图: 工厂方法用单独的类来进行提供。

如果语法层面上,不强制要求构造方法名字必须和类名一致,就没有上述模式的必要了。

三、标准库中的线程池

3.1 标准库线程池参数解释:

ThreadPoolExecutor:

使用起来比较复杂,在其构造方法中,包含很多的参数。(面试考点)例如下面这个就是包含全部参数的构造方法,了解这个了,其他的就都会了,下面会围绕这个构造方法参数进行解释。

3.1.1 corePoolSize | maximumPoolSize:

在 Java 的标准库中线程池把线程分成两类:1. 核心线程。2. 非核心线程。

顾名思义 corePoolSize 就是核心线程数,maximumPoolSize 就是最大线程数(核心线程数 + 非核心线程数

评论 115
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值