• [并发]线程池技术小白



    1  线程池技术介绍

    在面向对象编程中。创建和销毁对象是非常费时间的。由于创建一个对象要获取内存资源或者其他很多其他资源。在Java中更是如此。虚拟机将试图跟踪每个对象,以便可以在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能降低创建和销毁对象的次数。特别是一些非常耗资源的对象创建和销毁。

    怎样利用已有对象来服务就是一个须要解决的关键问题,事实上这就是一些"池化资源"技术产生的原因。比方大家所熟悉的数据库连接池正是遵循这一思想而产生的,本文将介绍的线程池技术相同符合这一思想。

    诸如Webserver、数据库server、文件server和邮件server等很多server应用程序都须要处理一种常见的情况:单个任务处理的时间非常短而请求的数目却是巨大的。如果我们构建一个简单server应用程序模型:每当一个请求到达就创建一个新的服务对象。然后在新的服务对象中为请求服务。server程序利用线程技术响应客户请求已经司空见惯,可能您觉得这样做效率已经非常高,可是当我们遇到大量的客户并发地訪问应用server时採用这样的server模型会有非常多问题。我们採用线程池技术来解决这样的单个任务处理时问非常短而请求数目却是巨大的这样的难题。

    眼下。一些著名的大公司都特别看好这项技术,并早已经在他们的产品中应用该技术。比方IBM的WebSphere,IONA的Orbix 2000在SUN的Jini中,Microsoft的MTS(MicrosoftTransaction Server 2.0)。COM+等。

    2 引入线程池技术的原因

       在应用server中须要处理从client发起的任务请求。这些任务往往具有高密度、短时间的特性。不管通过什么方式在server得到client请求后,server都须要独立地处理这个客户请求。

    针对这个问题,线程池提供了处理系统性能和大用户量请求之间的矛盾的方法。

    通过对多个任务重用已经存在的线程对象,减少了对线程对象创建和销毁的开销。当客户请求时,线程对象已经存在。能够提高请求的响应时间。从而总体地提高了系统服务的表现。

       多线程技术主要解决处理器单元内多个线程运行的问题,它能够使处理器尽量保持忙碌状态,充分利用系统的可用资源,使得系统的性能得到显著提高。可是假设对多线程技术应用不当的话。也会事与愿违。能够通过一个简单的样例来说明这一点。

       线程运行过程分为三个部分:T1、T2、T3。当中T1表示线程创建的时间。T2表示线程运行任务所需时间,包含线程间同步所需时间,T3表示线程销毁时间。那么我们能够看出,运行任务所需时间T为T1+T2+T3,然而真正处理任务的时间为T2,线程本身的开销为T1、T3两部分之和。这样线程开销占总时间的比例为(T1+T3)/(T1+T2+T3)。假设任务处理的时间T2比較短小,那创建和销毁的开销所占的比例将会很大。因而怎样降低T1和T3两部分时间是须要解决的问题。线程池正是着眼于降低T1和T3这两部分时间的开销,使得系统的效率提高。他把T1和T3分别安排在server程序启动和结束的时间段或者一些空暇的时间段,这样在server程序处理客户请求时就不会T1和T3开销了。

    3 线程池技术长处

    线程池技术有着例如以下几个方面的长处:

    (1)能够控制产生线程的数量。通过预先创建一定数量的工作线程并限制其数量,控制线程对象的内存消耗。

      (2)减少系统开销和资源消耗。

    通过对多个请求重用线程、线程创建、销毁的开销被分摊到了多个请求上。另外就是通过限制线程数量、减少系统在垃圾回收方面的开销。

    (3)提高系统响应速度。线程事先已被创建,请求到达时可直接进行处理。消除了因线程创建所带来的时间延迟,另外多个线程能够并发处理。

       (4)Java线程池的编程模型相对于原有的多线程编程模型来说,另一大改进,那就是线程代码和业务代码的分离。

    4线程池工作原理

       一般来说实现一个线程池主要包含下面几个组成部分:

    (1)线程管理器:用于创建并管理线程池。

    (2)工作线程:线程池中实际运行任务的线程。在初始化线程时会预先创建好固定数目的线程在池中。这些初始化的线程通常是处于空暇状态,不消耗CPU,占用较小的内存空间。

    (3)任务接口:每一个任务必须实现的接口,当线程池中的可运行的任务时,被工作线程调试运行。把任务抽象出来形成任务接口。能够做到线程池与详细的任务无关。

    (4)任务队列:用来存放没有处理的任务,提供一种缓冲机制。实现这样的结构有好几种方法,经常使用的是队列,主要是利用它先进先出的工作原理;第二种是链表之类的数据结构,能够动态为它分配内存空间。应用中比較灵活。我们用到的是链表数据结构形式来实现任务队列。

  • 相关阅读:
    PowerMockito
    java--树封装
    plugin--Lombok
    Mysql--sql
    Oracle--sql
    hive--分区表和分桶表
    hive支持的数据类型和存储格式
    HashMap
    golang 创建 tun 设备
    golang ctrie demo
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6717621.html
Copyright © 2020-2023  润新知