现在服务器端的应用程序几乎都采用了“线程池”技术,这主要是为了提高系统效率。因为如果服务器对应每一个请求就创建一个线程的话,在很短的一段时间内就会产生很多创建和销毁线程动作,导致服务器在创建和销毁线程上花费的时间和消耗的系统资源要比花在处理实际的用户请求的时间和资源更多。线程池就是为了尽量减少这种情况的发生。
 
  下面我们来看看怎么用Java实现一个线程池。一个比较简单的线程池至少应包含线程池管理器、工作线程、任务队列、任务接口等部分。其中线程池管理器(ThreadPool Manager)的作用是创建、销毁并管理线程池,将工作线程放入线程池中;工作线程是一个可以循环执行任务的线程,在没有任务时进行等待;任务队列的作用是提供一种缓冲机制,将没有处理的任务放在任务队列中;任务接口是每个任务必须实现的接口,主要用来规定任务的入口、任务执行完后的收尾工作、任务的执行状态等,工作线程通过该接口调度任务的执行。

在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程

  第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 
  第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 
  第三:提高线程的可管理性。 
常用线程池:
  ExecutorService 是主要的实现类,其中常用的有 :
  Executors.newSingleThreadPool()
  Executors.newFixedThreadPool()
  Executors.newcachedTheadPool()
  Executors.newScheduledThreadPool()

1、为什么要用线程池:

1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。

2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。

Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService。

比较重要的几个类:

ExecutorService    真正的线程池接口。
ScheduledExecutorService    能和Timer/TimerTask类似,解决那些需要任务重复执行的问题。
ThreadPoolExecutor    ExecutorService的默认实现。
ScheduledThreadPoolExecutor    继承ThreadPoolExecutor的ScheduledExecutorService接口实现,周期性任务调度的类实现。

要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,很有可能配置的线程池不是较优的,因此在Executors类里面提供了一些静态工厂,生成一些常用的线程池。

1. newSingleThreadExecutor

创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。

2.newFixedThreadPool

创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。

3. newCachedThreadPool

创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,

那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。

4.newScheduledThreadPool

创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。

在java中,如果每个请求到达就创建一个新线程,开销是相当大的。在实际使用中,服务器在创建和销毁线程上花费的时间和消耗的系统资源都相当大,甚至可能要比在处理实际的用户请求的时间和资源要多的多。除了创建和销毁线程的开销之外,活动的线程也需要消耗系统资源。如果在一个jvm里创建太多的线程,可能会使系统由于过度消耗内存或“切换过度”而导致系统资源不足。为了防止资源不足,服务器应用程序需要采取一些办法来限制任何给定时刻处理的请求数目,尽可能减少创建和销毁线程的次数,特别是一些资源耗费比较大的线程的创建和销毁,尽量利用已有对象来进行服务,这就是“池化资源”技术产生的原因。
     线程池主要用来解决线程生命周期开销问题和资源不足问题。通过对多个任务重复使用线程,线程创建的开销就被分摊到了多个任务上了,而且由于在请求到达时线程已经存在,所以消除了线程创建所带来的延迟。这样,就可以立即为请求服务,使用应用程序响应更快。另外,通过适当的调整线程中的线程数目可以防止出现资源不足的情况。

2、线程池的组成部分
    一个比较简单的线程池至少应包含线程池管理器、工作线程、任务列队、任务接口等部分。其中线程池管理器的作用是创建、销毁并管理线程池,将工作线程放入线程池中;工作线程是一个可以循环执行任务的线程,在没有任务是进行等待;任务列队的作用是提供一种缓冲机制,将没有处理的任务放在任务列队中;任务接口是每个任务必须实现的接口,主要用来规定任务的入口、任务执行完后的收尾工作、任务的执行状态等,工作线程通过该接口调度任务的执行。
      线程池管理器至少有下列功能:创建线程池,销毁线程池,添加新任务。
      工作线程是一个可以循环执行任务的线程,在没有任务时将等待。
      任务接口是为所有任务提供统一的接口,以便工作线程处理。任务接口主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等。
3、线程池适合应用的场合
      当一个服务器接受到大量短小线程的请求时,使用线程池技术是非常合适的,它可以大大减少线程的创建和销毁次数,提高服务器的工作效率。但是线程要求的运动时间比较长,即线程的运行时间比

java线程池的作用相关推荐

  1. Java 线程池的作用以及该如何使用

    服务端应用程序(如数据库和 Web 服务器)需要处理来自客户端的高并发.耗时较短的请求任务,所以频繁的创建处理这些请求的所需要的线程就是一个非常消耗资源的操作.常规的方法是针对一个新的请求创建一个新线 ...

  2. Kafka必须掌握的核心技术:简述Java线程池的作用和实现方式

    Part 1消息队列 介绍消息队列技术的背景,包括使用场景和消息队列的功能特点,并设计了一个简单的消息队列. 1.1 系统间通信技术介绍 1.2 为何要用消息队列 1.3 消息队列的功能特点 1.4 ...

  3. java线程池有什么作用_java线程池的作用是什么?线程池介绍

    你知道java中线程池的作用是什么吗?那么究竟什么是线程池呢?都有哪些类型呢?让我们对以上的问题来进行详细的了解吧. 一.java线程池作用 第一个我们先来对它的作用进行一下简单的介绍,使用线程池的优 ...

  4. Java线程池有哪些作用

    线程池 线程池的作用 核心点:复用机制提前创建好固定的线程一直在运行状态实现复用限制线程创建数量. 1.降低资源消耗:通过池化技术重复利用已创建的线程,降低线程创建和销毁造成的损耗. 2.提高响应速度 ...

  5. 四种Java线程池用法解析

    四种Java线程池用法解析 本文为大家分析四种Java线程池用法,供大家参考,具体内容如下 http://www.jb51.net/article/81843.htm 1.new Thread的弊端 ...

  6. java线程池的使用例子,不愧是大佬

    京东Java研发岗一面(基础面,约1小时) 自我介绍,主要讲讲做了什么和擅长什么 springmvc和spring-boot区别 @Autowired的实现原理 Bean的默认作用范围是什么?其他的作 ...

  7. 面试题:四种Java线程池用法解析 !=!=未看

    1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? 1 2 3 4 5 6 7 8 new Thread(new Runnable() {   @Override   ...

  8. java 线程池ThreadPoolExecutor

    线程池 线程池的作用: 线程池作用就是限制系统中执行线程的数量. 根 据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少了浪费了系统资源,多了造成系统拥挤效率不高.用线程池控制线程数 ...

  9. 由浅入深理解Java线程池及线程池的如何使用

    前言 多线程的异步执行方式,虽然能够最大限度发挥多核计算机的计算能力,但是如果不加控制,反而会对系统造成负担.线程本身也要占用内存空间,大量的线程会占用内存资源并且可能会导致Out of Memory ...

最新文章

  1. js的object的key需要引号吗,JavaScript中对象是否需要加引号?
  2. gogs只支持mysql5.7_Gogs 搭建教程
  3. java8新特性简述
  4. linux中/usr下文件权限修改setuid导致的问题
  5. Feign Hystrix (HystrixCommonKey) 设置单独接口的超时时间和FallBack
  6. linux取消中文网,SELinux如何关闭
  7. 我的一个树莓派小车项目
  8. python实现简单爬虫抓取图片
  9. 单词排序(信息学奥赛一本通-T1185)
  10. delphi webbrowser 经常使用的演示样本
  11. ubuntu关闭自动更新、打开 ubuntu 的 apport 崩溃检测报告功能
  12. Linux安装Firefly
  13. 常用开源 SLAM 方案
  14. SQLServer之修改DEFAULT约束
  15. 台式机也应该设置为WIN10节能模式
  16. BusHound详细使用说明
  17. Mac卸载Anaconda
  18. java毕业生设计资源循环利用计算机源码+系统+mysql+调试部署+lw
  19. 分枝定界法,例题梳理
  20. QT-700多种实用好看的图标,直接拿来用

热门文章

  1. 税控服务器管理系统打印,工行南昌北西支行“营改增”税控服务器管理系统成功上线...
  2. 我虽是魔鬼,但也是那个爱你的可怜鬼
  3. 微信小程序云开发如何将页面生成为pdf?
  4. docker实战1:系统准备
  5. [sql]大型网站MySQL深度优化揭秘
  6. thymeleaf页面中使用th:onclick标签
  7. 40套MiniIcon分享
  8. 《炬丰科技-半导体工艺》磷化铟晶片的研磨减薄
  9. NFC 大电池 高性价比手机
  10. 运行速度最快的计算机语言,哪种编程语言又快又省电?有人对比了27种语言