JUC并发编程-第二天:线程池相关

2024-06-15 23:20

本文主要是介绍JUC并发编程-第二天:线程池相关,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

线程池相关

  • 线程池
    • 内置线程池的使用
    • 线程池的关闭
    • excute方法和submit方法的区别

线程池

线程池就是一个可以复用线程的技术

  public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler){return null;}

*[ ] 各个参数的含义

  • corePoolSize:线程池的核心线程数(正式员工)
  • maximumPoolSize:指定的最大线程数量(核心线程数和临时线程数之和)
    最大员工总数:正式员工+外包员工
  • keepAliveTime:临时线程存活时间(外包合同期限)
  • unit:临时线程存活时间单位
  • workQueue:任务队列(项目)
  • threadFactory:线程工厂(招人的hr)
  • handler:线程池拒绝策略

内置线程池的使用

内置线程池使用Executors工具类去创建线程池
在这里插入图片描述

public class ThreadPool {public static void main(String[] args) {//创建固定大小的线程池ExecutorService executorService = Executors.newFixedThreadPool(5);//创建单线程线程池ExecutorService threadExecutor = Executors.newSingleThreadExecutor();//创建动态线程线程池ExecutorService service = Executors.newCachedThreadPool();}
}

线程池的关闭

使用shutdown()或者shutdownNow()

  • shutdown():线程执行完后关闭;
  • shutdownNow():立即关闭,不管线程是否执行完毕;
    关闭线程池,如果不关闭,线程池中的线程会一直占用系统资源,会导致内存泄漏,主线程一直不会退出

excute方法和submit方法的区别

excute方法用来执行runable任务对象。而submit方法用来执行未来任务对象

  • 以计算1-100的任务为例
  • excuter方法
public class RunableExcuteTask implements Runnable{int goal;public RunableExcuteTask(int goal) {this.goal = goal;}@Overridepublic void run() {int sum=0;for (int i = 1; i <=goal ; i++) {sum=sum+i;}System.out.println("1-"+goal+"的和是:"+sum);}
}

测试

public class ThreadPool {public static void main(String[] args) {Runnable task=new RunableExcuteTask(100);ExecutorService threadPool = Executors.newFixedThreadPool(5);threadPool.execute(task);threadPool.shutdown();}
}
  • submit方法
public class CallableExcuteTask implements Callable<Integer> {int goal;public CallableExcuteTask(int goal) {this.goal = goal;}@Overridepublic Integer call() throws Exception {int sum=0;for (int i = 1; i <= goal; i++) {sum=sum+i;}return sum;}
}

测试

public class ThreadPool {public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService threadPool = Executors.newFixedThreadPool(5);CallableExcuteTask excuteTask = new CallableExcuteTask(100);Future<Integer> future = threadPool.submit(excuteTask);Integer integer = future.get();System.out.println(integer);}
}
  • 在处理异常方面

excute会在子线程中抛出异常,在主线程中捕捉不到;
submit不会立马抛出异常,而是会将异常暂时储存起来,等我们调用future.get()方法的时候才会抛出,并且可以在主线程中抛出。处理异常更方便

这篇关于JUC并发编程-第二天:线程池相关的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1064873

相关文章

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

JAVA保证HashMap线程安全的几种方式

《JAVA保证HashMap线程安全的几种方式》HashMap是线程不安全的,这意味着如果多个线程并发地访问和修改同一个HashMap实例,可能会导致数据不一致和其他线程安全问题,本文主要介绍了JAV... 目录1. 使用 Collections.synchronizedMap2. 使用 Concurren

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建

JavaScript Array.from及其相关用法详解(示例演示)

《JavaScriptArray.from及其相关用法详解(示例演示)》Array.from方法是ES6引入的一个静态方法,用于从类数组对象或可迭代对象创建一个新的数组实例,本文将详细介绍Array... 目录一、Array.from 方法概述1. 方法介绍2. 示例演示二、结合实际场景的使用1. 初始化二

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制