Java 并发-newFixedThreadPool

前言

为什么选择使用多线程?一种场景是在数据和业务处理能力出现瓶颈时,而服务器性能又有空闲,通常是cpu空闲,这时使用多线程就能很好的解决问题,而又无需加硬件,实际使用中,线程池又是最为常用的一种,本文介绍了newFixedThreadPool的使用方法

原理

newFixedThreadPool内部有一种阻塞队列,是一个无界的LinkedBlockingQueue,任务放在队列中,线程由线程池初始化创建好,如果有空闲线程,那么就调用去处理队列中的任务,没有就排队

需要注意的是这个队列可能会变得很大,要注意线程池的处理能力,避免排队任务太多造成内存溢出,其最大值是Integer的上限,不过由于是链表,也可以无限延长,或者可以在参数中显式创建有界阻塞队列,避免这个问题

实际使用

java 复制代码
ExecutorService executor = Executors.newFixedThreadPool(num);

创建线程池,这里num是线程数量

然后这里做了一个循环模拟运行线程,注意最后要关闭线程池

java 复制代码
  for (int i = 0; i < 10; i++) {
            executorService.execute(new Task(i));
        }
        executorService.shutdown();
        
 class Task implements Runnable {
    private int id;
 
    public Task(int id) {
        this.id = id;
    }
 
    public void run() {
        System.out.println("Task " + id + " is running...");
    }       

这种方法是execute方式,也可以使用submit方式,这两种方式区别在于

1,可以用Future对象获取submit的结果

2,execute()方法只能接受Runnable类型的任务,而submit()方法既可以接受Runnable类型的任务,也可以接受Callable类型的任务。

3,execute()方法是一种异步提交方式,即提交任务后立即返回,不会等待任务执行完成。而submit()方法是一种同步提交方式,即提交任务后会阻塞当前线程,直到任务执行完成。

4,而execute()方法没有提供取消任务的方法,submit()方法返回的Future对象可以用来取消任务

5,execute()方法中如果任务执行过程中发生了异常,则异常会被传递到任务提交的地方,并由任务提交的线程来处理。而submit()方法中,如果任务执行过程中发生了异常,异常将被封装在Future对象中,直到调用Future.get()方法时才会将异常抛出

优缺点

NFTP线程池优点在于使用简单,不需要手动的创建,管理,调度线程;同时由于线程数固定,不会出现超出导致系统崩溃,作为一个多线程的实现可以有效处理并发

缺点在于线程数固定,无法动态调整,同时暂存任务的阻塞队列长度无限拓展可能会造成内存耗尽,同时也无法控制任务时长,可能造成后续任务等待时间超长乃至失败,在笔者实际使用时,还发现这个线程池如果重复创建,可能会造成耗尽cpu资源,因为没有任务时长的控制,线程池执行过慢导致阻塞,这时即时手动interrupt依然会堆积线程,导致cpu执行过久无响应

相关推荐
j7~7 分钟前
【C++】STL--string类--拆析解剖string类的实现以及string类的底层详解(2)
开发语言·c++·浅拷贝·深拷贝·string类的实现·string拷贝构造·string赋值重载
实在智能RPA11 分钟前
航空Agent落地效果评估指标:2026年企业级智能自动化价值度量体系拆解
java·网络·人工智能·ai·自动化
程序员二叉16 分钟前
【JUC】AQS底层深度拆解|独占/共享模式|队列原理全详解
java·开发语言·面试·juc
踏着七彩祥云的小丑18 分钟前
Go 学习第6天:结构体 + 切片 + range遍历
开发语言·学习·golang·go
读书札记202221 分钟前
Qt中windeployqt.exe工具的使用:解决使用CMake创建的项目点击exe文件后系统提示0xc000007b的问题
开发语言·qt
地铁潜行者22 分钟前
消息堆积后,为什么一扩容消费者,MySQL 先被打崩了?
java·后端
地铁潜行者25 分钟前
订单状态更新成功了,分账消息却没发出去:聊聊本地消息表的一致性坑
java·后端
亦暖筑序25 分钟前
Java 8老系统SQL Agent实战:AI生成候选SQL,安全引擎拦截后再执行
java·人工智能·sql
CodeStats27 分钟前
《源纹天书》卷一:归元初醒(第1-5章)
java
大囚长31 分钟前
大模型服务端如何命中缓存
java·人工智能·缓存·dubbo