线程池产生原因:
创建很多线程造成的两个问题:
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多线程学习笔记之自定义线程池 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
JUC(Java Util Concurrent)是Java中用于并发编程的工具包,提供了一组接口和类,用于处理多线程和并发操作。JUC提供了一些常用的并发编程模式和工具,如线程池、并发集合、原子操作等。 JUC的主要特点包括: ...
a:手上项目所需,因为项目主要的目的是实现多线程的数据推送;需要创建多线程的话,那就要处理好线程安全的问题;因为项目需要,还涉及到排队下载的功能,所以就选择了线程池来管理线程以及线程池里面的任务队列...
其中采用Java 的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送请求. 注意,此为学习笔记,可以作为参考学习使用,不建议商业使用或生产使用。 废话不多说,直接上代码。
该文档是笔者在学习李刚老师《Java疯狂讲义》中有关多线程的用法而总结出来的笔记,其中主要的内容包括线程创建和启动、线程的生命周期、控制线程、线程同步、线程通信线程池等基本内容。对Java多线程有详细的介绍。
该文档是笔者在学习李刚老师《Java疯狂讲义》中有关多线程的用法而总结出来的笔记,其中主要的内容包括线程创建和启动、线程的生命周期、控制线程、线程同步、线程通信线程池等基本内容。对Java多线程有详细的介绍。...
以上笔记是我总结4种Java的多线程的创建方式,这个笔记给有需要的人学习,一起增长知识,介绍了什么是进程,什么是线程,以及并发与并行的概念,还有线程池的使用
主要介绍多线程开发中如何使用集合(三种方法)。建议大家关注一下java.util. concurrent包中的相关类。 4.线程池。你需要明确的是: 任务只是一组逻辑工作单元,而线程则是任务异步执行的机制。任务与任务的执行是相...
线程安全、volatile关键字、原子性、并发包、死锁、线程池学习笔记
做的学习笔记,并加入了自己的理解,谢谢 使用线程池的原因 我们创建的线程在运行结束后都会被虚拟机销毁,如果线程数量多的话,频繁的创建和销毁线程会大大浪费时间和效率,更重要的是浪费内存,线程池可以让线程...
Java技术基础 4 1.1编程语言 4 1.2 Java的特点 4 1.3 Java开发环境 4 1.4 Java开发环境配置 5 1.5 Linux命令与相关知识 5 ...5.12 Thread线程类及多线程 61 5.13 Socket网络编程 65 5.14线程池 67 5.15双缓冲队列 68
(1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 (2)建模简单:通过使用线程可以讲复杂并且异步的工作流进一步分解成一组简单并且同步的工作流,每个工作流在一个单独的线程...
3. 采用模拟 Proacto r的事件处理模式,利用线程池实现多线程机制,实现高并发通信,减少频繁创建和销毁线程带来的开销;(信号和互斥锁) 4. 主进程负责事件的读写,子线程负责业务逻辑——用有限状态机解析HTTP...
课程简介本课程是《Java初级至应用》系统课程的第十章,全套课程精细讲解,课程超过其他机构30%的课程量,经过我们全套课程系统学习的同学,可轻松从事Java工程师或系统架构师岗位,课程提供全套代码笔记其它相关...
java7 hashmap源码 随着Java学习的不断深入,发现...多线程下,hashmap的resize()方法为什么容易出现死循环? 答: 其他面试题? 答: 并发 概述 :star::star: :star::star: 线程池 :star: AQS :star: 锁 ListenalbeFut
PHP最能体现这个特点:它不仅屏蔽了异步,甚至连多线程也不提供,PHP都是以同步阻塞的方式来执行。这样的优点利于程序猿顺序编写业务逻辑,但在复杂的网络应用中,阻塞导致它无法更好地并发。 在服务器端,I/O非常...
[目录]Java学习笔记(推荐) 6. [目录]JDBC文档 7. [目录]RMI 文档 2. [目录]Java资源(文档-书籍-下载-注册码) 1. [目录]License 和注册码 2. [目录]好书推荐 3. [目录]关于Java的...