设为首页 - 加入收藏
广告 1000x90
您的当前位置:78345黄大仙救世网24码 > 接口开销 > 正文

10065---【Java多线程】线程池的工作原理详解(上)

来源:未知 编辑:admin 时间:2019-07-03

  多线程技术可以解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力;

  接受突发性的大量请求,但不至于使服务器因此产生大量线程的应用。突发性大量客户请求,在没有线程池情况下,将产生大量线程,虽然理论上大部分操作系统线程数目最大值不是问题,短时间内产生大量线程可能使内存到达极限。

  ScheduledExecutorService:功能和Timer类似,解决那些需要任务重复执行的问题,负责线程的调度

  Future 接口:它和FutureTask类(实现了Future接口)都用来表示异步计算的结果。

  当提交一个任务时,线程池创建一个新线程执行任务,直到当前线程数等于corePoolSize;如果当前线程数为corePoolSize,继续提交的任务被保存到阻塞队列中,等待被执行;如果执行了线程池的prestartAllCoreThreads()方法,线程池会提前创建并启动所有核心线)maximumPoolSize :线程池中允许的最大线程数

  如果当前阻塞队列满了,判断是否达到最大线程数,若没有,则创建新的线程执行任务,否则进行拒绝策略。但如果使用了无界的任务队列这个参数就没用了。

  当线程没有任务执行时,继续存活的时间;默认情况下,该参数只在线程数大于corePoolSize时才有用。

  :基于数组结构的有界阻塞队列,此队列按FIFO(先进先出)原则对元素进行排序。

  :基于链表结构的无界阻塞队列,按FIFO排序任务,吞吐量通常要高于ArrayBlockingQuene;

  :一个不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQuene;

  :具有优先级的无界阻塞队列;(6)threadFactory :创建线程的工厂

  可以选择DefaultThreadFactory,将创建一个同线程组且默认优先级的线程,也可以选择PrivilegedThreadFactory,使用访问权限创建一个权限控制的线程。但默认采用DefaultThreadFactory,当然也可以创建自定义线程工厂给每个新建的线程设置一个具有识别度的线)handler

  线程池的饱和策略,当阻塞队列满了,且没有空闲的工作线程,如果继续提交任务,必须采取一种策略处理该任务,线种策略:

  CallerRunsPolicy:如果发现线程池还在运行,就直接运行这个线程,即用调用者所在的线程来执行任务;

  DiscardOldestPolicy:丢弃阻塞队列中靠最前的任务,并执行当前任务;

  RejectedExecutionHandler接口,自定义饱和策略,如记录日志或持久化存储不能处理的任务。

  ()方法 :用于提交需要返回值的任务线程池会返回一个Future类型的对象,通过这个 Future对象可以判断任务是否执行成功,并且可以通过future的get()方法来获取返回值,但get()方 法会阻塞当前线程直到任务完成,而使用get(long timeout,TimeUnit unit)

  方法则会阻塞当前线 程一段时间后立即返回,这时候有可能任务没有执行完。(2)execute

  ()方法 :用于提交不需要返回值的任务,无法判断任务是否被线程池执行成功,线程池在执行excute方法时,会出现以下几种情况:① 如果当前运行的线程少于corePoolSize,则创建新线程来执行任务(需要获得全局锁);②如果运行的线程等于或多于corePoolSize ,则将任务加入BlockingQueue;

  ③如果无法将任务加入BlockingQueue(队列已满并且正在运行的线程数量小于 maximumPoolSize),则创建新的线程来处理任务(需要获得全局锁)

  ④如果创建新线程将使当前运行的线程超出maxiumPoolSize(队列已满并且正在运行的线程数量大于或等于 maximumPoolSize),任务将被拒绝,并调用RejectedExecutionHandler.rejectedExecution()方法(线程池会抛出异常,告诉调用者”我不能再接受任务了”);

  线程池采取上述的流程进行设计是为了减少获取全局锁的次数。在线程池完成预热(当前运行的线程数大于或等于corePoolSize)之后,几乎所有的excute方法调用都执行步骤②,还有两种情况如下:

  ⑥当一个线程无事可做,超过一定的时间(keepAliveTime)时,线程池会判断,如果当前运行的线程数大于 corePoolSize,那么这个线程就被停掉。所以线程池的所有任务完成后,它最终会收缩到 corePoolSize 的大小

  遍历线 程池中的工作线程,然后逐个调用线程的interrupt方法来中断线程,所以无法响应中断的任务 可能永远无法终止。

  自jdk1.5开始,Java开始提供ScheduledThreadPoolExecutor类来支持周期性任务的调度,在这之前,这些工作需要依靠Timer/TimerTask或者其它第三方工具来完成。但Timer有着不少缺陷,如Timer是单线程模式,调度多个周期性任务时,如果某个任务耗时较久就会影响其它任务的调度;如果某个任务出现异常而没有被catch则可能导致唯一的线程死掉而所有任务都不会再被调度。ScheduledThreadPoolExecutor解决了很多Timer存在的缺陷。

  注:绿色虚线表示实现的接口,黄色实线表示继承的类,绿色实线表示接口间的继承。

  转载地址(只转载了前部分):前言线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,...博文来自:

  先说说我个人对线程池的理解:线程池顾名思义是一个装有很多线程的池子,这个池子维护着从线程创建到销毁的怎个生命周期以及线程的分配,用户只需要把任务提交给这个线程池而不用去关心线程池如何创建线程,线程池会...博文来自:

  最近在看java线程池实现方面的源码,在此做个小结,因为网上关于线程池源码分析的博客挺多的,我也不打算重复造轮子啦,仅仅用纯语言描述的方式做做总结啦!       个人认为要想理解清楚java线程池实...博文来自:

  Java并发编程:线程池的使用在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束...博文来自:

  线、提高资源利用率线程池可以重复利用已经创建了的线、提高响应速度因为当线程池中的线程没有超过线程池的最大上限时,有的线程处于等待分配任务状态,当任务到来时,无需创建线、具有可管理性...博文来自:psply的博客

  多线.使用一个类继承Thread类,并重写run()方法,然后实例化该类,执行start()方法,start()启动线程并执行自己的run()方法,我自己写的一个小例子:2.使用一个...

  线程池作为Java中一个重要的知识点,看了很多文章,在此以Java自带的线程池为例,记录分析一下。本文参考了Java并发编程:线程池的使用、Java线程池—addWorker方法解析、线程池、Thre...

  1、线程池简介:   多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。      假设一个服务器完成一项任务所需时间为:T1创建线程时间...博文来自:Hsuxu的专栏

  一.线程池:其实到目前为止我们接触过很多关于池的概念:string池、连接池,之所以要用这个池,目的只有一个:资源的重复使用。线程池:首先创建一些线程,当服务器接收到一个客户请求后,就从线程池中取出一...

  1、线程池简介:   多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。      假设一个服务器完成一项任务所需时间为:T1创建线程时间...

  08-31阅读数 326一、为什么需要线程池随着系统用户的逐渐增多,为了提高用户响应,提供一个高并发,高可用的系统。java的线程池就可以解决很多问题。很多异步,并发的场景都可以用到线.降低重复创建线程的开销,统一...

  学习Java多线程运行原理一直在多线程这块存在问题,不敢去看,了解其运行原理,今天终于学习了,其实没有想的那么复杂,不罗嗦了,开始记录吧。线程池的实现原理:判断线程池里的核心线程是否都在执行任务,如果...博文来自:coder_chen的专栏

  阅读数 681多线程的基本工作原理:现已一个main函数中启动线程A和线程B为例,简单讲述程序工作过程;    1、启动JVM时,对操作系统而言就是一个独立的进程,分配给独立的内存空间等等,    2、JVM启动完...博文

  任务与执行策略之间的隐性耦合依赖性任务当在线程池中执行独立的任务时,可以随意地改变线程池的大小和配置,这些修改只会对执行性能产生影响。如果提交给线程池的任务需要依赖其它的任务,那么就隐含地给执行策略带...

  线程的创建和销毁都是很耗费时间的,如果小任务比较多(比如频繁的接入接出),每一个任务都创建一个线程的话,我们把执行该任务分为三个片段,T运行的整个时间,T1线线程等待以及任务处理的时...

  前言做java开发的,一般都避免不了要面对java线程池技术,像tomcat之类的容器天然就支持多线程。即使是做偏后端技术,如处理一些消息,执行一些计算任务,也经常需要用到线程池技术。鉴于线程池技术的...博文来自:

  为什么要使用线程池降低资源消耗:通过重复利用线程,减少线程的创建销毁损耗的资源提高响应速度:任务到达时,不用重新创建线程,之间可以使用已经创建好的线程执行提高线程的可管理性线程池实现原理java.ut...

  Java面试-线面试题:讲一下线程池(腾讯、京东面试题)一、为什么使用线程池由于创建和销毁线程都需要很大的开销,运用线程池就可以大大的缓解这些内存开销很大的问题;可以根据系统的承受能力,调整线程池中工作线线程的数目,...

  07-04阅读数 1432线程关于什么是线程我相信大家都知道,可是线程池可能还是有不明白的同学吧,这里我就简单介绍一下。线程池是一个“容器”,在我们使用线程的时候统一使用容器来创建并维护线程池,这样就有个好处我们的线程数量可以...

  在我们开发中经常会使用到多线程,比如在Android中,网络请求或一些耗时操作必须放在子线程中运行,往往会通过Thread开启一个子线程去执行耗时操作,待子线程执行完毕后再通过Handler切换到主线...博文来自:

  Java并发2——Java线一线概念  线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址、文件I/O等),又可以独立调度(线程是CPU调...

  ThreadPoolExecutor是一个ExecutorService,它使用可能的几个池线程之一执行每个提交的任务,通常使用Executors工厂方法配置。线程池可以解决两个不同问题:由于减少了每...博文来自:

  阅读数 6886线程在项目中有时候是很重要的一部分,对于那些不需要返回结果只需调用而且执行之间较长的方法,可考虑用线程实现。但是线程的频繁创建和销毁会降低系统的性能,因此多线程情况下最好要考虑线程池技术。线程池的多种...

  1.线程池:线程池就是就像一个容器,而这个容器就是用来存放线程的,且有固定的容量。如果没有线程池,当需要一个线程来执行任务时就需要创建一个线程,我们设创建线,执行线,销毁线...博文来自:TH226的专栏

  1.当我们发现无法联网时,我们运行下面命令或者ping命令rnip  addrrnrn结果没有显示局域网的IP地址rn2.我们去修改网卡配置文件,把网络连接打开rncd /rncd  /etc/sys...博文

  jquery/js实现一个网页同时调用多个倒计时(最新的)11-25阅读数 57万+

  07-27阅读数 3万+上一篇博客介绍了如何解决Fragment重叠的问题,有需要的同学可以看一下,底部有demo下载。 n直通车:完美解决Fragment重叠本篇博客我们来说一下怎么让fragment重新加载布局资源文件。...

本文链接:http://acrylinkg.com/jiekoukaixiao/308.html

相关推荐:

网友评论:

栏目分类

现金彩票 联系QQ:24498872301 邮箱:24498872301@qq.com

Copyright © 2002-2011 DEDECMS. 现金彩票 版权所有 Power by DedeCms

Top