【Java EE 初阶】线程池简介及实现过程

目录

1.线程池是什么?

2.为什么要使用线程池?

 3.如何使用线程池

1.JDK给我们提供了一些方法来创造线程池

4.设计模式之工厂模式

1.工厂模式用途

5.自定义一个线程池

1.可以提交任务到线程池,那么就会有一种数据结构来保存我们提交的任务

2.创建线程池是需要指定初始线程数量,这些线程不停的扫描阻塞队列,如果有任务就立即执行

3.实现过程

6.创建线程池时方法构造的参数及含义?

 7.线程池的工作原理?(七个参数是如何搭配使用的)

​编辑

 8.拒绝策略(四种方式)

9.为什么不推荐使用系统自带的线程池?

1.使用了无界队列,可能会有系统资源耗尽的情况

2.临时线程无法控制,也会有系统资源耗尽的情况发生

10.创建线程池时,核心线程数目指定多少合适?


1.线程池是什么?

  • 线程池就是用来存放线程的一个池子
  • 当程序启动的时候就创建出若干个线程
  • 有任务就处理,没有任务就阻塞等待

比如在JDBC编程中,通过DataSource获取Connectoin的时候就已经用到了池的概念

271196efd16343adb3d441acb59cde74.png

2.为什么要使用线程池?

为了减少系统资源的开销

e72658b7e5f744c9b57d7cb1ce683350.png

线程池的作用就是为了减少这些关于申请与释放PCB的操作,尽量保证我们的程序在用户态执行

 3.如何使用线程池

1.JDK给我们提供了一些方法来创造线程池

9b5572c5261248a197ad3d110579a1d6.png

无界队列,指的是对于队列中元素的个数不加以限制,可能会出现内存被消耗殆尽的情况

4.设计模式之工厂模式

1.工厂模式用途

解决构造方法创建对象的不足

5.自定义一个线程池

1.可以提交任务到线程池,那么就会有一种数据结构来保存我们提交的任务

可以用阻塞队列来实现

2.创建线程池是需要指定初始线程数量,这些线程不停的扫描阻塞队列,如果有任务就立即执行

可以用线程池的构造方法,接收要创建线程的数据

3.实现过程

import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;

public class MyThreadPoll {
    //定义一个阻塞队列来存放线程
    BlockingDeque<Runnable> queue = new LinkedBlockingDeque<>(3);

    //对外提供方法,用来提交任务
    public void submit(Runnable runnable) throws InterruptedException {
        queue.put(runnable);
    }
    //构造方法初始化线程
    public MyThreadPoll(int compacity){
        if(compacity <= 0) {
            throw new RuntimeException("初始线程任务不可以小于1");
        }
        //创建线程不停扫描任务
        for (int i = 0; i < compacity; i++) {
            Thread thread = new Thread(() -> {
                while (true) {
                    try {
                        Runnable take = queue.take();
                        take.run();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            //启动线程
            thread.start();
        }
    }

}

6.创建线程池时方法构造的参数及含义?

 1.int corePoolSize:核心线程数,创建线程时包含的最小线程数量

int maximumPoolSize: 最大线程数,也叫临时线程数,允许系统可以创建的最多线程数量

long keepAliveTime:临时线程空闲的时长

TimeUnit unit:空闲的时间单位,与keepAliveTime一起使用

BlockingQueue<Runnable> workQueue:用来保存任务的阻塞队列

 7.线程池的工作原理?(七个参数是如何搭配使用的)

 8.拒绝策略(四种方式)

9.为什么不推荐使用系统自带的线程池?

1.使用了无界队列,可能会有系统资源耗尽的情况

2.临时线程无法控制,也会有系统资源耗尽的情况发生

10.创建线程池时,核心线程数目指定多少合适?

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值