Java多线程之线程池

简介: 1. 线程池的作用2. 使用线程池的好处3. 线程池的七个参数4. 线程池执行任务的流程5. Java 标准库中的线程池1)newFixedThreadPool2)newCachedThreadPool3)newScheduleThreadPool4)newSingleThreadExecutor6. 对比两种提交任务的方法

1. 线程池的作用

创建和销毁线程都需要消耗系统资源,线程池就是为了降低系统资源消耗而存在的


线程执行完任务之后不会被销毁,而是放入线程池中,下次使用就直接在线程池中取,减少了创建和销毁线程消耗的资源


2. 使用线程池的好处

降低系统资源消耗,通过重复利用线程池中的线程来降低创建和销毁线程的消耗

提高响应速度,当任务到达时,不再需要等待创建完线程再执行

提高线程的可管理性,使用线程池可以统一对线程进行分配、调度和监控


3. 线程池的七个参数

corePoolSize:核心线程最大数量,核心线程一经创建就不会被销毁,除非线程池销毁

maximumPoolSize:线程池中最大线程数量,总线程数 = 核心线程数 + 非核心线程数

keepAliveTime:非核心线程的最大空闲时间,非核心线程在 keepAliveTime 时间后还没有执行任务,就会被销毁

unit:keepAliveTime 的时间单位,秒、分钟或者其他单位

workQueue:阻塞队列,有 ArrayBlockingQueue、LinkedBlockingQueue 等,用来存放线程任务

ThreadFactory:线程工厂,用来创建线程

RejectedExecutionHandler:拒绝策略,如果任务数量超过线程池最大负荷(),该怎么处理

AbortPolicy():丢弃当前线程任务,抛出异常

DiscardPolicy():丢弃当前线程任务,不抛异常

DiscardOldestPolicy():丢弃阻塞队列队首任务,不抛异常

CallerRunsPolicy():当前任务由调用者线程执行


4. 线程池执行任务的流程

51.jpg

5. Java 标准库中的线程池

Java 标准库中提供了 Executers 类来创建线程池,Executers 类创建线程池的方法有以下几种


1)newFixedThreadPool

创建一个固定线程数量的线程池,每提交一个任务就创建一个工作线程,工作线程数量达到指定的最大值,就将任务放入阻塞队列中


2)newCachedThreadPool

创建一个可缓存线程池,此类线程池中的所有线程只有 60 秒的最大空闲时间,线程空闲超过 60 秒就会被销毁,线程数量几乎没有限制


3)newScheduleThreadPool

创建一个定长的线程池,此线程池支持周期性的执行和延时执行某一个任务


使用 scheduleAtFixedRate() 或 scheduleWithFixedDelay() 即可实现周期性的任务执行

// 创建线程池
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
// 以下两种方法结果相同,延迟五秒开始执行,每隔两秒执行一次
scheduledExecutorService.scheduleAtFixedRate(thread2, 5, 2, TimeUnit.SECONDS);
scheduledExecutorService.scheduleWithFixedDelay(thread2, 5, 2, TimeUnit.SECONDS);

4)newSingleThreadExecutor

创建一个单线程化的线程池,线程池中只有唯一一个线程来执行任务,保证所有线程按照指定顺序执行,如果这个线程异常结束了,就会创建另一个线程来替代他。


6. 对比两种提交任务的方法

向线程池提交任务一般使用 execute() 和 submit()


execute() 方法用于提交不需要返回值的任务,所以无法判断任务是否被执行成功

submit() 方法用于提交需要返回值的任务,线程池会返回一个 Future 类型的对象,通过这个对象可以判断任务是否执行成功,可以通过该对象的 get() 方法获取返回值。


目录
相关文章
|
4天前
|
安全 Java UED
Java中的多线程编程:从基础到实践
本文深入探讨了Java中的多线程编程,包括线程的创建、生命周期管理以及同步机制。通过实例展示了如何使用Thread类和Runnable接口来创建线程,讨论了线程安全问题及解决策略,如使用synchronized关键字和ReentrantLock类。文章还涵盖了线程间通信的方式,包括wait()、notify()和notifyAll()方法,以及如何避免死锁。此外,还介绍了高级并发工具如CountDownLatch和CyclicBarrier的使用方法。通过综合运用这些技术,可以有效提高多线程程序的性能和可靠性。
|
4天前
|
缓存 Java UED
Java中的多线程编程:从基础到实践
【10月更文挑战第13天】 Java作为一门跨平台的编程语言,其强大的多线程能力一直是其核心优势之一。本文将从最基础的概念讲起,逐步深入探讨Java多线程的实现方式及其应用场景,通过实例讲解帮助读者更好地理解和应用这一技术。
21 3
|
8天前
|
Java 调度 UED
深入理解Java中的多线程与并发机制
本文将详细探讨Java中多线程的概念、实现方式及并发机制,包括线程的生命周期、同步与锁机制以及高级并发工具。通过实例代码演示,帮助读者理解如何在Java中有效地处理多线程和并发问题,提高程序的性能和响应能力。
|
6天前
|
缓存 安全 Java
使用 Java 内存模型解决多线程中的数据竞争问题
【10月更文挑战第11天】在 Java 多线程编程中,数据竞争是一个常见问题。通过使用 `synchronized` 关键字、`volatile` 关键字、原子类、显式锁、避免共享可变数据、合理设计数据结构、遵循线程安全原则和使用线程池等方法,可以有效解决数据竞争问题,确保程序的正确性和稳定性。
13 2
|
7天前
|
存储 安全 Java
Java-如何保证线程安全?
【10月更文挑战第10天】
|
8天前
|
Java
|
8天前
|
Java
【编程进阶知识】揭秘Java多线程:并发与顺序编程的奥秘
本文介绍了Java多线程编程的基础,通过对比顺序执行和并发执行的方式,展示了如何使用`run`方法和`start`方法来控制线程的执行模式。文章通过具体示例详细解析了两者的异同及应用场景,帮助读者更好地理解和运用多线程技术。
21 1
|
2天前
|
缓存 算法 Java
Java 中线程和纤程Fiber的区别是什么?
【10月更文挑战第14天】
10 0
|
8天前
|
Java 应用服务中间件 测试技术
Java21虚拟线程:我的锁去哪儿了?
【10月更文挑战第8天】
19 0
|
10天前
|
Java 程序员 开发者
Java中的多线程基础与实用技巧
【10月更文挑战第7天】本文旨在通过浅显易懂的语言和生动的比喻,向读者展示Java中多线程编程的世界。我们将一起探索创建线程的不同方法,理解线程生命周期的奥秘,并通过一些实用的技巧来避免常见的多线程陷阱。无论你是初学者还是有一定经验的开发者,这篇文章都将为你揭开多线程编程的神秘面纱,让你在并发编程的道路上走得更稳、更远。