手把手带你了解《线程池》

线程池的概念

线程池:提前把线程准备好,创建线程不是直接从系统申请,而是从池子里拿,线程不用了还给池子。
复用线程,平摊线程的创建与销毁的开销代价

池的目的

池的目的是提高效率,线程的创建虽然比进程轻量,频繁创建,开销也不可忽略

线程池的优势

1、避免了线程的重复创建与开销带来的资源消耗代价
2、提升了任务响应速度,任务来了直接选一个线程执行而无需等待线程的创建
3、线程的统一分配和管理,也方便统一的监控和调优

为什么从池子里拿线程更高效?

从池子里拿线程:纯粹的用户态操作。
从系统创建线程:涉及到用户态和内核态的切换,真正的切换是在内核态完成的。

结论:纯用户态操作时间可控,涉及到内核操作不可控。

构造方法参数讲解

在这里插入图片描述

参数说明
corePoolSize核心线程数
maximumPoolSize最大线程数
keepAliveTime线程保持存活时间
TimeUnit unit时间单位
workQueue因为线程池要管理很多任务,这些任务通过阻塞队列来阻止的,程序员可以手动给线程池一个阻塞队列。submit方法就是把任务放到队列中
threadFactory工厂模式,创建线程的辅助类
handler线程池拒绝策略

线程拒绝策略

在这里插入图片描述
1、如果满了,继续添加任务,添加操作跑出异常。
2、添加的线程自己负责执行这个任务。
3、丢弃最老任务
4、丢弃最新的任务

模拟实现线程池

package Test1;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class ThreadDemo3 {
    //阻塞队列,添加任务
    private BlockingQueue<Runnable>queue=new LinkedBlockingQueue<>();
    //将任务添加到队列中
    public void submit(Runnable runnable){
        try {
            queue.put(runnable);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
    //定义线程数量
    public ThreadDemo3(int n){
        for(int i=1;i<=n;i++){
            Thread t=new Thread(()->{
                while(true) {
                    try {
                        Runnable runnable = queue.take();//取任务
                        runnable.run();//执行任务
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            //启动线程
            t.start();
        }
    }
}

一个线程池设置多少线程合适?

首先
线程并不是越多越好,多少合适取决于CPU。
其次
不同程序,线程要做的活也不一样;
1、CPU密集型任务,主要做一些计算工作,要在CPU上运行。
2、IO密集型任务,主要是等待IO操作,不咋吃CPU
假设,你的线程全是任务全是使用CPU密集型任务,线程数就不能超过核心数(逻辑核心数),如果是IO任务则可以超过核心数。
但是具体还是要通过测试方式来确定(计算执行时间,同时检测资源使用状态,测试多次取均值)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值