net线程池是什么(c线程池的作用)

.net线程池是什么,c线程池的作用

内容导航:

  • 线程池处理流程是什么
  • 什么是线程池
  • 什么是线程池如何使用为什么要用
  • linuxC互斥线程池是什么
  • 一、线程池处理流程是什么

    提交任务后,线程池先判断线程数是否达到了核心线程数(corePoolSize)。如果未达到线程数,则创建核心线程处理任务;否则,就执行下一步;

    接着线程池判断任务队列是否满了。如果没满,则将任务添加到任务队列中;否则,执行下一步;

    接着因为任务队列满了,线程池就判断线程数是否达到了最大线程数。如果未达到,则创建非核心线程处理任务;否则,就执行饱和策略,默认会抛出RejectedExecutionException异常。


    我们可以先看下线程池的类图

    我们可以通过lExecutor来创建一个线程池。

    线程池的核心参数如下,这也是常问的面试题。

    corePoolSize(线程池的基本大小):当提交一个任务到线程池时,线程池会创建一个线程来执行任务,即使其他空闲的基本线程能够执行新任务也会创建线程,等到需要执行的任务数大于线程池基本大小时就不再创建。如果调用了线程池的prestartAllCoreThreads方法,线程池会提前创建并启动所有基本线程。

    runnableTaskQueue(任务队列):用于保存等待执行的任务的阻塞队列。 可以选择以下几个阻塞队列。

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

    LinkedBlockingQueue:一个基于链表结构的阻塞队列,此队列按FIFO (先进先出)
    排序元素,吞吐量通常要高于ArrayBlockingQueue。静态工厂方法hreadPool()使用了这个队列。

    SynchronousQueue:一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue,静态工厂方法ThreadPool使用了这个队列。

    PriorityBlockingQueue:一个具有优先级的无限阻塞队列。

    maximumPoolSize(线程池最大大小):线程池允许创建的最大线程数。如果队列满了,并且已创建的线程数小于最大线程数,则线程池会再创建新的线程执行任务。值得注意的是如果使用了无界的任务队列这个参数就没什么效果。

    ThreadFactory:用于设置创建线程的工厂,可以通过线程工厂给每个创建出来的线程设置更有意义的名字。

    RejectedExecutionHandler(饱和策略):当队列和线程池都满了,说明线程池处于饱和状态,那么必须采取一种策略处理提交的新任务。这个策略默认情况下是AbortPolicy,表示无法处理新任务时抛出异常。以下是JDK1.5提供的四种策略。

    AbortPolicy:直接抛出异常。

    CallerRunsPolicy:只用调用者所在线程来运行任务。

    DiscardOldestPolicy:丢弃队列里最近的一个任务,并执行当前任务。

    DiscardPolicy:不处理,丢弃掉。

    当然也可以根据应用场景需要来实现RejectedExecutionHandler接口自定义策略。如记录日志或持久化不能处理的任务。

    keepAliveTime(线程活动保持时间):线程池的工作线程空闲后,保持存活的时间。所以如果任务很多,并且每个任务执行的时间比较短,可以调大这个时间,提高线程的利用率。

    TimeUnit(线程活动保持时间的单位):可选的单位有天(DAYS),小时(HOURS),分钟(MINUTES),毫秒(MILLISECONDS),微秒(MICROSECONDS,
    千分之一毫秒)和毫微秒(NANOSECONDS, 千分之一微秒)。

    还有一个面试题经常也会被问到

    核心线程数和最大线程数是怎么一个关系?

    核心线程满了,接下来进队列,队列也满了,创建新线程,直到达到最大线程数,之后再超出,会进入拒绝rejectedExecution。

    二、什么是线程池

    线程池,thread
    pool,是一种线程使用模式,线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。功能:应用程序可以有多个线程,这些线程在休眠状态中需要耗费大量时间来等待事件发生。其他线程可能进入睡眠状态,并且仅定期被唤醒以轮循更改或更新状态信息,然后再次进入休眠状态。为了简化对这些线程的管理,.NET框架为每个进程提供了一个线程池,一个线程池有若干个等待操作状态,当一个等待操作完成时,线程池中的辅助线程会执行回调函数。线程池中的线程由系统管理,程序员不需要费力于线程管理,可以集中精力处理应用程序任务。

    三、什么是线程池如何使用为什么要用

    线程池,thread pool,是一种线程使用模式,线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。
    功能:应用程序可以有多个线程,这些线程在休眠状态中需要耗费大量时间来等待事件发生。
    其他线程可能进入睡眠状态,并且仅定期被唤醒以轮循更改或更新状态信息,然后再次进入休眠状态。
    为了简化对这些线程的管理,.NET框架为每个进程提供了一个线程池,一个线程池有若干个等待操作状态,当一个等待操作完成时,线程池中的辅助线程会执行回调函数。
    线程池中的线程由系统管理,程序员不需要费力于线程管理,可以集中精力处理应用程序任务。
    扩展资料:应用范围1、需要大量的线程来完成任务,且完成任务的时间比较短。
    WEB服务器完成网页请求这样的任务,使用线程池技术是非常合适的。
    因为单个任务小,而任务数量巨大,你可以想象一个热门网站的点击次数。
    但对于长时间的任务,比如一个Telnet连接请求,线程池的优点就不明显了。
    因为Telnet会话时间比线程的创建时间大多了。
    2、对性能要求苛刻的应用,比如要求服务器迅速响应客户请求。
    3、接受突发性的大量请求,但不至于使服务器因此产生大量线程的应用。
    突发性大量客户请求,在没有线程池情况下,将产生大量线程,虽然理论上大部分操作系统线程数目最大值不是问题,短时间内产生大量线程可能使内存到达极限,并出现”OutOfMemory”的错误。
    参考资料来源:搜狗百科—线程池一、线程池的作用:线程池作用就是限制系统中执行线程的数量。
    根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。
    用线程池控制线程数量,其他线程排队等候。
    一个任务执行完毕,再从队列的中取最前面的任务开始执行。
    若队列中没有等待进程,线程池的这一资源处于等待。
    当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了;否则进入等待队列。
    二、为什么要用线程池:1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
    2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。
    Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。
    真正的线程池接口是ExecutorService。
    三、如何使用:要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,很有可能配置的线程池不是较优的,因此在Executors类里面提供了一些静态工厂,生成一些常用的线程池。
    1. newSingleThreadExecutor创建一个单线程的线程池。
    这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。
    如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。
    此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
    hreadPool创建固定大小的线程池。
    每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。
    线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。
    3. newCachedThreadPool创建一个可缓存的线程池。
    如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。
    此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
    ledThreadPool创建一个大小无限的线程池。
    此线程池支持定时以及周期性执行任务的需求。

    四、linuxC互斥线程池是什么

    答:C代码#include#include#include#include#defineMAXS1000#defineMAXTDS5//线程池大小doublemyjg[MAXS+1];//计算结果存放位置intmax;pthread_mutex_tmylock,eventlock;pthread_cond_tmyevent;pthread_tthreads[MAXTDS+2];//线程池,完成1/n计算intisend=0;voidmycomp(voidx){//计算1/i的结果,计算结果放在一个数组中。inti=0;while(1){pthread_mutex_lock(&mylock);if(myjg[0]=max){//计算完毕,退出线程isend=1;//深未来技术/break;}}}voidmyprint1(voidxx){//读取数组,将计算结果累加,最终完成1/1+1/2+1/3+……+1/n的计算intmaxi;intcuri=1;doublejg=0;while(curiMAXS){//n的最大值printf(“pleaseinputaninteger:(<=%d)“,MAXS);};//深未来技术/myjg[0]=0;pthread_create(&(threads[0]),NULL,myprint1,NULL);pthread_create(&(threads[1]),NULL,myprint2,NULL);for(inti=2;i<=MAXTDS;i++){pthread_create(&(threads[i]),NULL,mycomp,NULL);sleep(1);}sleep(1);return(0);

    版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/129669.html

    (0)
    robot
    上一篇 2022-08-19
    下一篇 2022-08-19

    相关推荐

    • 「网页前端需要什么」web前端需要什么

      网页前端需要什么,web前端需要什么内容导航:网页前端主要学啥WEb前端开发的需要学哪些知识什么是网页前端建前端网页开发需要学什么语言一、网页前端主要学啥Web前端入门简单,非常适合零基础小白去学的。想学好Web前端,怎么少得了一份学习路线?下面分享一份自己收藏的Web前端的学习路线,希望能帮到大家。学Web前端一般在

      2022-05-06
      0
    • 医疗营销策略是什么(医院营销策略都有哪些)

      医疗营销策略是什么,医院营销策略都有哪些内容导航:医药营销策略医药企业销售策略有哪些促销策略是什么营销策略如何理解医疗市场营销一、医药营销策略医药行业属于比较传统的行业,有其高投入、高风险、高回报、长周期的特点,但因市场竞争力大,行业渠道混乱,经营

      2022-04-30
      0
    • Atlas是否支持自动化任务调度和工作流程管理

      是的,Atlas支持自动化任务调度和工作流程管理。用户可以使用Atlas的Scheduled Tasks功能来创建和调度定期运行的任务,也可以使用Workflow功能来定义和执行复杂的工作流程。这些功能可以帮助用户自动化各种常见的数据处理和分析任务,提高工作效率并减少人为错误。

      2024-03-30
      0
    • ai中的4种画笔是什么(ai画笔类型)

      ai中的4种画笔是什么,ai画笔类型 内容导航: AI铅笔工具、画笔工具和斑点画笔工具的用法和区别是什么 illustrator 画笔的类型 如何大开脑洞这些App 你来试一试 a…

      2022-06-03
      0
    • 重装ubuntu系统的步骤是什么

      重装Ubuntu系统的步骤如下:备份重要数据:在重装系统之前,请务必备份所有重要数据,以免丢失。下载Ubuntu安装镜像:访问Ubuntu官方网站,下载最新版本的Ubuntu安装镜像(ISO文件)。制作启动U盘或光盘:将下载好的Ubuntu安装镜像制作成启动U盘或光盘。进入BIOS设置:将电脑重启并进入BIOS设置界面,将启动顺序设置为从U盘或光盘启动。安装Ubuntu系统:按照安装向导的指引,选

      2024-03-08
      0
    • systemidle过高怎么办(电脑卡顿严重解决方法)

      最近感觉自己的i7笔记本电脑很卡,我就打开了任务管理器看CPU和内存,结果我发现了有一个“SystemIdleProcess”的进程CPU居然占了90%,SystemIdleProcess占用率非常的高,都快100%了。想要了解“System

      2021-08-28
      0