线程池
JDK1.5以后提供了一个线程池执行器,可以使用线程池执行一组任务。先看一下示例,代码来自于JDK文档。
class NetworkService {
private final ServerSocket serverSocket;
private final ExecutorService pool;
public NetworkService(int port, int poolSize) throws IOException {
serverSocket = new ServerSocket(port);
//创建线程池
pool = Executors.newFixedThreadPool(poolSize);
}
public void serve() {
try {
for (;;) {
//使用线程池执行Runnable任务
pool.execute(new Handler(serverSocket.accept()));
}
} catch (IOException ex) {
pool.shutdown();
}
}
}
/*
需要执行的任务。
*/
class Handler implements Runnable {
private final Socket socket;
Handler(Socket socket) { this.socket = socket; }
public void run() {
// read and service request
}
}
示例代码使用工厂Executors创建了一个固定大小的线程池,并且使用线程池来执行Runnable任务。示范了使用线程池的基本的步骤:创建线程池,使用线程池执行任务。
关于线程池的说明
1、 池的大小。池有一个CoreSize和MaximumSize,当池中线程小于CoreSize时,使用execute执行任务,线程池会创建一个线程来执行任务,即使池中有空闲的线程。如果线程池中线程数目在CoreSize和MaximumSize之间,如果任务队列满了,不能缓存任务,线程池会创建新的线程来执行新来的任务。CoreSize和MaximumSize一样时,就创建了一个固定大小的线程池。MaximumSize甚至可以设置成Integer.MAX_VALUE,每一个并发任务都不会等待。可以使用setCorePoolSize(int)和
setMaximumPoolSize(int)来设置池的大小。
2、 线程的激活时间。对于池中超过CoreSize的线程,如果空闲了一段时间,线程池会自动终止线程以减少资源消耗。这个时间通过setKeepAliveTime(long, java.util.concurrent.TimeUnit)来设置。
.
3、
线程的创建。默认使用Executors.defaultThreadFactory()来创建线程,这些线程属于一个组,有普通的优先级,非daemon状态。如果有不同的需求,可以自己实现一个ThreadFactory,提供给Executors创建线程池。譬如使用以下语句创建线程池, newFixedThreadPool
(int nThreads, ThreadFactory threadFactory)
4、 任务队列的大小。任意的BlockingQueue都可以作为任务队列。任务队列和线程池的交互:
i. 线程数小于CoreSize,总是新建线程,不管Queue如何
ii. 如果线程数目等于或大于CoreSize,Queue优先缓存任务。
iii. 如果线程数目小于MaximumSize,Queue已经满,创建线程。如果线程数目达到MaximumSize,Queue满,拒绝任务,扔出RejectedExecutionException。
任务队列的策略:
1. 不缓存。每一个任务进来立即处理,要求无界 maximumPoolSizes 以避免拒绝新提交的任务,适合处理有内部依赖的任务。
2. 无界队列。当线程达到CoreSize时,缓存任务,适合处理没有依赖的任务。
3. 有边界的队列。当使用有限的 maximumPoolSizes 时,有界队列(如 ArrayBlockingQueue)有助于防止资源耗尽,但是可能较难调整和控制。队列大小和最大池大小可能需要相互折衷:使用大型队列和小型池可以最大限度地降低 CPU 使用率、操作系统资源和上下文切换开销,但是可能导致人工降低吞吐量。如果任务频繁阻塞(例如,如果它们是 I/O 边界),则系统可能为超过您许可的更多线程安排时间。使用小型队列通常要求较大的池大小,CPU 使用率较高,但是可能遇到不可接受的调度开销,这样也会降低吞吐量。
分享到:
相关推荐
1. SpringBoot 自定义线程池以及多线程间的异步调用(@Async、@EnableAsync) 2.Java多线程之定时任务 以及 SpringBoot多线程实现定时任务 3.@EnableScheduling 与 @Scheduled
Java多线程是Java编程中的一个重要领域,它允许程序同时执行多个任务,从而提高系统效率和资源利用率。在这个未完成的案例中,我们可能正在探讨如何在Java中创建和管理线程,以及处理多线程环境下的并发问题。下面是...
这个名为"Java多线程的小例子——吃包子"的示例,旨在帮助开发者直观地理解多线程的工作原理。下面我们将深入探讨该示例所涉及的核心知识点。 首先,多线程通常涉及到以下几个关键概念: 1. **线程(Thread)**:...
在Java编程中,多线程是一项关键技能,尤其在处理并发任务时,如我们的示例——"Java多线程下载网络图片"。这个场景展示了如何利用多线程技术提高程序性能,减少用户等待时间,同时优化系统资源的使用。下面我们将...
本文将深入探讨一个轻量级的Java多线程池实现,这个实现允许线程间的通信,并提供了类似Akka Actor的调度功能。 首先,我们要理解Java中的线程池。线程池是一种线程使用模式,它维护一组可以重复使用的线程,避免了...
【Java练手小项目——多线程...通过这个“Java练手小项目——多线程聊天室”,你可以深入了解Java多线程的原理和实践,同时学习到网络编程和并发集合的运用,这对于提升你的Java编程技能和解决实际问题的能力大有裨益。
通过这个项目,学习者可以掌握Java多线程编程的基本概念和实际应用,了解线程池的使用,以及如何在并发环境中处理文件I/O。此外,还将锻炼到问题解决能力,如处理网络不稳定、断点续传等常见问题。对于Java程序员来...
Java多线程处理数据是一种常见的优化策略,尤其在面临大量数据查询时,通过并发执行任务可以显著提升程序的运行效率。以下将详细解释这个程序中的关键知识点: 1. **Callable接口**:`ThredQuery`类实现了`Callable...
### Java多线程的使用与介绍 #### 什么是多线程? 多线程是指程序能够同时执行多个线程的能力。每个线程都是一个轻量级的进程,可以在单个程序中独立运行,共享该程序的资源。在Java中,多线程是通过`java.lang....
7. **多线程**:JAVA提供了丰富的多线程支持,学习笔记会讲解线程的创建、同步、互斥以及线程池的使用。 8. **反射机制**:JAVA反射机制允许在运行时动态地获取类的信息并操作类的对象,这对于插件开发、动态代理等...
1. `Runnable`: 这是Java中最基础的多线程接口,只需实现`run()`方法,然后通过`Thread`对象启动新线程来执行这个任务。例如: ```java Runnable task = new Runnable() { @Override public void run() { // ...
1. **多线程下载原理** 多线程下载的基本思想是将一个大文件分割成若干个较小的部分,每个部分由一个独立的线程负责下载。当所有线程同时工作时,它们会并行地从服务器获取数据,从而加快整体下载速度。这种技术...
一、Java多线程编程 多线程是Java的一个强大特性,它允许一个应用程序同时执行多个任务。在Java中,每个线程代表程序中的一个独立的执行流。通过创建和管理多个线程,开发者可以提高程序的并发性,使得程序在等待I/...
- Java多线程编程涉及多个方面的知识和技术,从基本的线程创建到高级的同步机制,都是开发高效、可靠的多线程应用程序所必需的。 - 正确理解和使用这些技术对于提高程序性能、避免死锁等问题至关重要。
### Java多线程编程知识点详解 #### 一、线程基础概述 - **定义与特点:** - **线程**是一种比进程更细粒度的执行单元,它允许在一个进程中并发执行多个任务。 - **轻量级进程**:线程有时被称为轻量级进程,...
在深入探讨Java多线程之前,我们先来了解一些基本的概念——进程与线程。 - **进程**:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位。每个进程拥有独立的地址空间和其他资源。进程之间相互独立,...
在Java编程领域,多线程是面试中常见且重要的知识点,尤其对于系统设计和高并发处理的岗位至关重要。本文将围绕“多线程面试题”这一主题,深入探讨相关概念、技术及其应用。 1. **线程的概念**:线程是程序执行的...
总之,Java多线程编程技术对于高效利用现代多核处理器的计算能力、开发高性能应用程序至关重要。掌握这门技术,不仅可以编写出更高效的代码,还可以在设计系统架构时做出更加合理的决策。然而,随着并发级别的提高,...
Java多线程是Java编程中的核心...Java多线程技术在开发高并发系统时至关重要,理解和掌握这些知识点有助于编写高效、稳定的并发程序。同时,要时刻注意线程安全问题,避免数据竞争和死锁,以保证程序的正确性和性能。