并发编程之线程池的详细解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 并发编程之线程池的详细解析

线程池

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

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

第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的销耗。

第二:提高响应速度。当任务到达时,任务可以不需要等待线程创建就能立即执行。

第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会销耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

线程池类的结构:

Executors 线程池工具类,用来创建线程池实例化

固定大小的线程池 FixedThreadPool

运行结果:

可以看到,线程池中的三个线程轮流执行任务。

代码:

public class ThreadPool {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(3);//创建固定大小的线程池
        try {
            for (int i = 0; i < 5; i++) {
                executorService.execute(()->{
                    System.out.println(Thread.currentThread().getName()+"--开始任务");
                });
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            executorService.shutdown();
        }
    }
}

动态扩容的线程池 CachedThreadPool

运行结果:

模拟各个线程排队过来执行任务,线程池只需要开辟一个线程就正好可以一个一个执行任务

代码:

public class ThreadPool {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();//创建动态大小的线程池
        try {
            for (int i = 0; i < 5; i++) {
                try {
                    TimeUnit.SECONDS.sleep(1);  //模拟各个线程排队过来执行任务
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                executorService.execute(()->{
                    System.out.println(Thread.currentThread().getName()+"--开始任务");
                });
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            executorService.shutdown();
        }
    }
}

运行结果:

模拟各个线程同时过来执行任务,线程池同时创建五个线程来执行任务

代码:

public class ThreadPool {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();//创建固定大小的线程池
        try {
            for (int i = 0; i < 5; i++) {
                executorService.execute(()->{
                    System.out.println(Thread.currentThread().getName()+"--开始任务");
                });
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            executorService.shutdown();
        }
    }
}


相关文章
|
10月前
|
Java
并发编程之线程池的底层原理的详细解析
并发编程之线程池的底层原理的详细解析
106 0
|
存储 Java 调度
多线程学习之线程池
多线程学习之线程池
80 0
|
10天前
|
存储 监控 Java
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
125 60
【Java并发】【线程池】带你从0-1入门线程池
|
10月前
|
缓存 Java 调度
掌握Java并发编程:线程池深入解析
【4月更文挑战第22天】在Java高并发编程中,线程池是提升应用性能、优化资源分配的关键工具。合理使用线程池能够显著减少系统开销,提高响应速度。本文将深入探讨线程池的工作原理、核心参数及其设计原则,并通过实例分析其在实际开发中的应用,旨在为开发者提供一套高效管理线程资源的方法论。
|
10月前
|
安全 Java 调度
Java并发编程:线程池深入解析
【5月更文挑战第29天】本文将详细探讨Java中的线程池技术,包括其基本原理、使用方法以及在实际开发中的应用。我们将通过实例代码和性能分析,深入理解线程池的优势和潜在问题,为高效、安全的并发编程提供指导。
|
10月前
|
监控 Java
并发编程之线程池的详细解析
并发编程之线程池的详细解析
43 0
|
10月前
|
安全 Java 程序员
多线程案例-线程池
多线程案例-线程池
165 0
|
安全 Java
异步编程 - 03 线程池ThreadPoolExecutor原理剖析&源码详解2
异步编程 - 03 线程池ThreadPoolExecutor原理剖析&源码详解2
77 0
|
Java
异步编程 - 03 线程池ThreadPoolExecutor原理剖析&源码详解1
异步编程 - 03 线程池ThreadPoolExecutor原理剖析&源码详解
63 0
|
Java
并发编程——线程池
为了避免频繁创建和销毁线程造成不必要的性能,一般在使用线程时,会采用线程池。
38 0