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() 方法获取返回值。


目录
相关文章
|
1天前
|
安全 Java 程序员
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第20天】本文将深入探讨Java并发编程的核心概念,包括线程安全和性能优化。我们将详细解析synchronized关键字、ReentrantLock类以及java.util.concurrent包中的高级工具类,如Semaphore、CountDownLatch和CyclicBarrier等。通过实例演示如何使用这些工具来提高多线程程序的性能和可靠性。
|
1天前
|
安全 算法 Java
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第20天】 在多核处理器日益普及的今天,并发编程成为了软件开发中不可忽视的重要话题。Java语言提供了丰富的并发工具和机制来帮助开发者构建高效且线程安全的应用程序。本文将探讨Java并发的核心概念,包括线程同步、锁机制、以及如何通过这些工具实现性能优化。我们将透过实例分析,揭示并发编程中的常见问题,并展示如何利用现代Java API来解决这些问题。
|
1天前
|
安全 Java 开发者
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第20天】在Java并发编程中,线程安全和性能优化是两个关键要素。本文将深入探讨Java并发编程的基本概念、线程安全的实现方法以及性能优化技巧。通过分析同步机制、锁优化、无锁数据结构和并发工具类的使用,我们将了解如何在保证线程安全的前提下,提高程序的性能。
|
1天前
|
安全 算法 Java
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第20天】 在Java开发中,正确处理并发问题对于确保应用的稳定性和提高性能至关重要。本文将深入探讨Java并发编程的核心概念——线程安全,以及如何通过各种技术和策略实现它,同时保持甚至提升系统性能。我们将分析并发问题的根源,包括共享资源的竞争条件、死锁以及线程活性问题,并探索解决方案如同步机制、锁优化、无锁数据结构和并发工具类等。文章旨在为开发者提供一个清晰的指南,帮助他们在编写多线程应用时做出明智的决策,确保应用的高效和稳定运行。
|
1天前
|
安全 Java
Java中的多线程编程:概念、实现及性能优化
【5月更文挑战第20天】在计算机科学中,多线程是一种允许程序同时执行多个任务的技术。Java作为一种广泛使用的编程语言,提供了对多线程编程的支持。本文将介绍Java中多线程的基本概念、实现方法以及性能优化策略,帮助读者更好地理解和应用多线程技术。
|
2天前
|
Java
Java一分钟之-并发编程:线程间通信(Phaser, CyclicBarrier, Semaphore)
【5月更文挑战第19天】Java并发编程中,Phaser、CyclicBarrier和Semaphore是三种强大的同步工具。Phaser用于阶段性任务协调,支持动态注册;CyclicBarrier允许线程同步执行,适合循环任务;Semaphore控制资源访问线程数,常用于限流和资源池管理。了解其使用场景、常见问题及避免策略,结合代码示例,能有效提升并发程序效率。注意异常处理和资源管理,以防止并发问题。
25 2
|
2天前
|
安全 Java 容器
Java一分钟之-并发编程:线程安全的集合类
【5月更文挑战第19天】Java提供线程安全集合类以解决并发环境中的数据一致性问题。例如,Vector是线程安全但效率低;可以使用Collections.synchronizedXxx将ArrayList或HashMap同步;ConcurrentHashMap是高效线程安全的映射;CopyOnWriteArrayList和CopyOnWriteArraySet适合读多写少场景;LinkedBlockingQueue是生产者-消费者模型中的线程安全队列。注意,过度同步可能影响性能,应尽量减少共享状态并利用并发工具类。
17 2
|
2天前
|
Java 程序员 调度
Java中的多线程编程:基础知识与实践
【5月更文挑战第19天】多线程编程是Java中的一个重要概念,它允许程序员在同一时间执行多个任务。本文将介绍Java多线程的基础知识,包括线程的创建、启动和管理,以及如何通过多线程提高程序的性能和响应性。
|
3天前
|
NoSQL Redis 缓存
【后端面经】【缓存】36|Redis 单线程:为什么 Redis 用单线程而 Memcached 用多线程?
【5月更文挑战第17天】Redis常被称为单线程,但实际上其在处理命令时采用单线程,但在6.0后IO变为多线程。持久化和数据同步等任务由额外线程处理,因此严格来说Redis是多线程的。面试时需理解Redis的IO模型,如epoll和Reactor模式,以及其内存操作带来的高性能。Redis使用epoll进行高效文件描述符管理,实现高性能的网络IO。在讨论Redis与Memcached的线程模型差异时,应强调Redis的单线程模型如何通过内存操作和高效IO实现高性能。
28 7
【后端面经】【缓存】36|Redis 单线程:为什么 Redis 用单线程而 Memcached 用多线程?
|
3天前
|
Java
深入理解Java并发编程:线程池的应用与优化
【5月更文挑战第18天】本文将深入探讨Java并发编程中的重要概念——线程池。我们将了解线程池的基本概念,应用场景,以及如何优化线程池的性能。通过实例分析,我们将看到线程池如何提高系统性能,减少资源消耗,并提高系统的响应速度。
13 5