Java 由浅入深聊聊线程池及原理

本文深入探讨Java线程池的优势,包括资源节省和响应速度提升。详细介绍了线程池的种类,如newFixedThreadPool、newSingleThreadExecutor等,并通过源码分析了其七大参数。此外,文章讲解了线程池的底层工作原理、拒绝策略,并提供了手写线程池的示例,最后讨论了线程池在CPU密集型和IO密集型任务中的合理配置策略。
摘要由CSDN通过智能技术生成

线程池的优势

线程池做的工作主要是控制运行的线程的数量,处理过程中将任务加入队列,然后在线程创建后启动这些任务,如果线程超过了最
大数量,超出的数量的线程排队等候等其他线程执行完毕再从队列中取出任务来执行。

他的主要特点为:线程复用;控制最大并发数;管理线程。

第一:降低资源消耗。通过重复利用自己创建的线程降低线程创建和销毁造成的消耗。
第二:提高响应速度。当任务到达时,任务可以不需要等到线程和粗昂就爱你就能立即执行。
第三:提高线程的可管理性。线程是稀缺资源,如果无限的创阿金,不仅会消耗资源,还会较低系统的稳定性,使用线程池可以进行统一分配,调优和监控。

架构图

Java中的线程池是通过Executor框架实现的

种类及使用

Java 线程池总共分为五种

1.newFixedThreadPool

创建一个定长线程池,可控制线程的最大并发数,超出的线程会在队列中等待。在某个线程被显式地关闭之前,池中的线程将一直存在。

newFixedThreadPool 创建的线程池 corePoolSize 和 MaxmumPoolSize 是相等的,阻塞队列使用的的LinkedBlockingQueue

示例

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPool {
    public static void main(String[] args) {
        ExecutorService threadPool = Executors.newFixedThreadPool(5);
        try {
            for (int i = 1; i < 10; i++) {
                threadPool.execute(()->{
                    System.out.println(Thread.currentThread().getName()+" invoked");
                });
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            threadPool.shutdown();//关闭线程池
        }
    }
}

结果

2.newSingleThreadExecutor

创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务都按照指定顺序执行。

newSingleThreadExecutor 将corePoolSize 和MaxmumPoolSize 设置为1,阻塞队列使用的的LinkedBlockingQueue

示例

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPool {
    public static void main(String[] args) {
        ExecutorService threadPool = Executors.newSingleThreadExecutor();
        try {
            for (int i = 1; i < 10; i++) {
                threadPool.execute(()->{
                    System.out.println(Thread.currentThread().getName()+" invoked");
                });
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            threadPool.shutdown();//关闭线程池
        }
    }
}

结果

3.newCachedThreadPool

创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则创建新线程。

newCachedThreadPool 将 corePoolSize 设置为 0,MaxmumPoolSize 设置为 Integer.MAX_VALUE,阻塞队列使用的是SynchronousQueue,也就是说来了任务就创建线程运行,如果线程空闲超过60秒,就销毁线程。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值