线程池产生原因:
创建很多线程造成的两个问题:
1.构建一个新的线程会涉及到与操作系统的交互,会消耗一定的系统资源,当使用完这些新创建的线程后,线程就会被销毁,然后当我们再创建的时候就会再次消耗系统资源,所以如果创建很多生命期很短的线程,就会消耗很大的系统资源,甚至给系统带来很大的压力。
2.现在不考虑重复创建很多线程造成的压力,单单从创建大量的线程并发执行任务这一点考虑,我们的系统能承受的线程数量是有限的,创建大量的线程会大大降低性能甚至是虚拟机崩溃。
所以这里为了解决创建多个线程造成的这两个问题是线程池的出生的意义。
线程池的作用:
1.减少重复创建线程造成的系统开销,线程池中的线程使用完后不会被销毁,当有新的任务时会继续使用线程池中的线程(除了只有一个线程的线程池(newSingleThreadExecutor),其他的线程池都有这种效果)
总而言之,减少线程创建,线程销毁所用的时间,当很多线程在线程池中运行完毕后,不会简单的将这些线程销毁,而是等待有新的任务过来之后,从线程池中拿出之前已经用过的线程,重复运行执行新的任务。
线程池的种类:
线程池的接口:ExecutorService
Executor类提供了四种线程池(这四种方法都是静态方法):
(1)newCachedThreadPool():(带缓存的线程池)
必要时创建新线程;空闲线程会被保留60s
(2) newFixedThreadPool():(固定数量线程的线程池)
该线程池中的线程数量有参数决定
(3)newSingleThreadExecutor():(单个线程的线程池)
它在一个单个的线程中依次执行各个任务
(4)newScheduledThreadPool():(可控制延迟时间或者周期执行线程的线程池)
具体四个线程池的介绍:
newCachedThreadPool():该方法构建了一个线程池,对于每个任务,如果有空闲线程可用,立即让它执行任务,如果没有可用的空闲线程,则创建一个新线程。也就是说,当线程池中的线程比较多,超出了我们任务所需的线程数量,许多线程就会空闲下来,这个线程池就会把空闲的线程回收,当任务增多了,线程池就会智能的从线程池中把线程拿出来使用。(线程池的大小不固定,跟系统能支持的线程数量有关)。
newFixedThreadPool(int i):该方法构建一个具有固定大小的线程池,如果提交的任务数多于空闲的线程数,那么把得不到服务的任务放置到队列中。当其他任务完成之后在运行它们。
newSingleThreadExecutor():是一个退化了的大小为1的线程池:有一个线程执行提交的任务,一个接一个,相当于排队执行任务,先来先执行。
newScheduledThreadPool():周期性的,定时的执行某些任务,该线程池中的线程的数量没有固定,相当于无限大。
线程池的使用方法:
只需要将待执行的任务放到run()方法中即可,将Runnable接口的实现类交给线程池的execute方法,作为它的一个参数。
Executor executor = Executors.newFixedThreadPool(6);
executor.execute(new Runnable(){
public void run(){
}
}
当用完一个线程池的时候,调用shutdown()方法,该方法启动该池的关闭序列,会先完成已经提交的任务而不再接收新的任务。(也可以调用shutdownNow()方法,那么取消该线程池中的尚未开始的所有任务并试图中断正在运行的线程)
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
版权声明:本文为博主原创文章,未经博主允许不得转载。
分享到:
相关推荐
Java并发编程实践中的线程池是一个关键的概念,它在多线程编程中扮演着至关重要的角色,有效地管理和调度线程资源,以提高系统的性能和效率。线程池通过复用已存在的线程来减少线程的创建和销毁开销,避免了频繁的上...
本篇学习笔记将深入探讨如何结合Socket与线程池来提升程序的运行效率。 一、Socket基础 Socket,也称为套接字,是网络编程中的一个重要概念,它是进程间通信(IPC)的一种方式,特别是在网络环境中。Socket提供了一...
这篇学习笔记将深入探讨Java多线程的核心概念、实现方式以及相关工具的使用。 一、多线程基础 1. 线程与进程:在操作系统中,进程是资源分配的基本单位,而线程是程序执行的基本单位。每个进程至少有一个主线程,...
线程池学习笔记 线程池是 Java 中一个非常重要的概念,它可以帮助我们更好地管理线程,从而提高系统的性能和可维护性。下面是关于线程池的详细知识点。 一、线程池类 Java 中的线程池类是 `java.util.concurrent....
Java多线程学习笔记之自定义线程池 本篇文章主要介绍了Java多线程学习笔记之自定义线程池,通过深入了解ThreadPoolExecutor这个核心类,我们可以自定义线程池,满足不同的线程池需求。 Java多线程学习笔记之自定义...
Java多线程详解 在Java编程中,多线程是一种重要的技术,它使得程序能够同时执行多个任务,提高系统的效率和响应性。本教程将详细讲解Java中的多线程概念,包括...通过实践和不断学习,你将成为一个多线程编程的专家。
Java 多线程是编程中的重要概念,尤其对于并发处理和高效系统设计至关重要。在Java中,多线程是通过两种主要方式实现的:继承`Thread`类或...学习多线程不仅是深入理解Java的关键,也是提升软件开发技能的重要步骤。
以下是对"C#多线程笔记"中可能包含的知识点的详细解释。 1. **线程基础**: - **什么是线程**:线程是程序执行的最小单元,每个进程至少有一个线程,负责执行程序代码。 - **主线程与子线程**:主线程是程序的...
以下是对马士兵多线程笔记的详细解析。 1. **多线程基础**:多线程是指一个应用程序中同时执行多个线程(即任务)的能力。这种并发执行可以提高系统资源的利用率,提升程序的响应速度和执行效率,特别是在多核...
#### 五、Java多线程学习笔记 ##### 1. 线程类 - **Thread类**: - 提供了创建和控制线程的方法。 - 可以通过继承`Thread`类或实现`Runnable`接口来创建线程。 ##### 2. 等待一个线程的结束 - **join()方法**: -...
### Java分布式应用学习笔记07线程池应用 在深入探讨Java分布式应用中线程池的应用之前,我们先来理解一下线程池的基本概念及其在并发编程中的重要性。线程池是Java并发编程的核心技术之一,它通过复用一组预创建的...
Java 线程学习笔记 Java 线程创建有两种方法: 1. 继承 Thread 类,重写 run 方法:通过继承 Thread 类并重写 run 方法来创建线程,这种方法可以使线程具有自己的执行逻辑。 2. 实现 Runnable 接口:通过实现 ...
在Windows平台上进行软件开发时,多线程编程是一项至关重要的技术。它允许应用程序同时执行多个独立的任务,提高系统的效率和响应性。Win32 API提供了丰富的接口来支持多线程编程,使得开发者能够构建复杂的并发应用...
本学习笔记将深入探讨Java多线程的相关知识,包括其原理、实现方式、同步机制以及常见问题。 ### 一、多线程的基本概念 多线程是指在一个程序中存在两个或更多的执行线程,这些线程共享同一内存空间,但各自拥有...
在本文中,我们将深入探讨Java多线程的相关知识点,并结合提供的源代码进行学习。 1. **线程的创建** - **实现Runnable接口**:创建一个类实现Runnable接口,然后将其实例传递给Thread类的构造函数,如`Thread t =...
这份"C++多线程学习笔记1"涵盖了基础到进阶的多线程概念,旨在帮助初学者快速掌握这一关键技能。 首先,C++11引入了对多线程的支持,引入了`<thread>`库,使得创建和管理线程变得简单。创建一个新的线程可以使用`...
Java多线程是Java编程中的核心概念,它允许并发执行多个任务,提高程序的执行效率。以下是关于Java多线程的详细知识点: 1. **创建线程** - **继承Thread类**:创建一个新的类,该类继承自Thread类,并重写run()...
在本学习笔记中,我们将探讨如何使用Java的Socket编程实现多线程服务器,特别是通过ExecutorService创建线程池来处理客户端的并发请求。ExecutorService是一个高级的线程管理工具,它允许我们更有效地管理和控制线程...