[java进阶]——线程池的使用,自定义线程池

简介: [java进阶]——线程池的使用,自定义线程池

一、线程池的存在意义

系统创建一个线程的成本是比较高的,因为它涉及到与操作系统交互,当程序中需要创建大量生存期很短暂的线程时,频繁的创建和销毁线程对系统的资源消耗有可能大于业务处理是对系统资源的消耗

二、线程池的使用

2.1线程池的核心原理

创建一个池子,池子是空的

提交任务时,池子会创建线程对象,任务执行完毕,将线程归还给池子,待下一个线程使用

提交任务时,池子中没有空闲线程,也无法创建新的线程,该任务就会排队等待

2.2线程池的代码实现

1.创建线程池

2.提交任务

3.所有任务执行完毕,关闭线程

public class Test1 {
    public static void main(String[] args) throws InterruptedException {
        //创建线程池
        ExecutorService pool1 = Executors.newCachedThreadPool();
        //创建指定数量的线程池
        ExecutorService pool2 = Executors.newFixedThreadPool(3);
        //提交任务
        pool2.submit(new Myrunable());
        pool2.submit(new Myrunable());
        pool2.submit(new Myrunable());
        pool2.submit(new Myrunable());
        pool2.submit(new Myrunable());
        //销毁线程池
        pool2.shutdown();
        //提交任务
        pool1.submit(new Myrunable());
        Thread.sleep(1000);
        pool1.submit(new Myrunable());
        Thread.sleep(1000);
        pool1.submit(new Myrunable());
        Thread.sleep(1000);
        //销毁线程池
        pool1.shutdown();
    }

三、自定义线程池

java把线程池封装为ThreadPoolExecutor类,利用构造方法创建线程池对象

3.1线程池的参数详解

3.2线程池的执行原理

3.3灵魂两问

一问:先提交的任务一定先被执行吗?

二问:临时线程何时创建?

答:

先提交任务不一定先执行,因为先提交的任务可能在等待队列中等待,而后提交的任务交给临时线程处理

当等待队列已满,创建临时线程

3.4线程池多大合适

CPU密集型的:最大并行数+1

I/O密集型的:最大并行数*cpu期望利用率*总时间/CPU计算时间

//获取虚拟机可获得的线程数

//我的电脑就是4核4线的

int count = Runtime.getRuntime().availableProcessors();

System.out.println(count);

3.5拒绝策略

当线程池中总线程数都在使用且等候队列也已满,触发拒绝策略

📕总结

以上就是学习线程池的相关内容,欢迎批评指正

相关文章
|
6天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第30天】本文将深入探讨Java并发编程中的一个重要主题——线程池。我们将从线程池的基本概念入手,了解其工作原理和优势,然后详细介绍如何使用Java的Executor框架创建和管理线程池。最后,我们将讨论一些高级主题,如自定义线程工厂和拒绝策略。通过本文的学习,你将能够更好地理解和使用Java的线程池,提高你的并发编程能力。
|
6天前
|
算法 安全 Java
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
【4月更文挑战第28天】性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
20 1
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
|
6天前
|
缓存 Java 调度
Java并发编程:深入理解线程池
【4月更文挑战第30天】 在Java并发编程中,线程池是一种重要的工具,它可以帮助我们有效地管理线程,提高系统性能。本文将深入探讨Java线程池的工作原理,如何使用它,以及如何根据实际需求选择合适的线程池策略。
|
6天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第30天】 本文将深入探讨Java中的线程池,解析其原理、使用场景以及如何合理地利用线程池提高程序性能。我们将从线程池的基本概念出发,介绍其内部工作机制,然后通过实例演示如何创建和使用线程池。最后,我们将讨论线程池的优缺点以及在实际应用中需要注意的问题。
|
7天前
|
监控 安全 Java
【多线程学习】深入探究阻塞队列与生产者消费者模型和线程池常见面试题
【多线程学习】深入探究阻塞队列与生产者消费者模型和线程池常见面试题
|
7天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第29天】在Java中,线程池是一种管理线程的强大工具,它可以提高系统性能,减少资源消耗。本文将深入探讨Java线程池的工作原理,如何使用它,以及在使用线程池时需要注意的问题。
|
7天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第29天】 在Java并发编程中,线程池是一种重要的工具,它可以帮助我们管理线程资源,提高系统性能。本文将深入探讨线程池的工作原理、使用方法以及如何根据实际需求选择合适的线程池参数。通过阅读本文,你将能够更好地理解和使用Java线程池,提高你的并发编程能力。
|
7天前
|
Java 调度 开发者
Java并发编程:深入理解线程池
【4月更文挑战第29天】 在现代Java应用中,高效地管理线程资源是至关重要的。线程池作为一种优化手段,其设计旨在减少在执行大量异步任务时创建和销毁线程的开销,同时提供一种机制来控制并发执行的任务数量。本文将深入探讨线程池的核心概念、使用场景以及它们如何影响系统性能。我们将剖析不同类型的线程池实现,并讨论如何根据具体需求选择合适的配置策略,以期帮助开发者避免常见的并发陷阱,提升应用的性能和稳定性。
|
7天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第29天】在Java并发编程中,线程池是提高程序性能和资源利用率的重要工具。本文将深入探讨线程池的工作原理、使用场景以及如何合理地配置线程池参数。通过阅读本文,你将能够更好地理解线程池的作用,并在实际应用中更加灵活地使用线程池。
|
8天前
|
Java 程序员 API
Java并发编程:深入理解线程池
【4月更文挑战第28天】本文将深入探讨Java并发编程中的一个重要概念——线程池。我们将从线程池的基本概念入手,逐步深入到线程池的工作原理、优势以及如何使用Java中的Executor框架来创建和管理线程池。通过本文的学习,你将能够更好地理解线程池在提高程序性能和资源利用率方面的重要性,并掌握如何在Java项目中合理地使用线程池。