第21讲丨java并发类库提供线程池有哪几种分别什么特点_第1页
第21讲丨java并发类库提供线程池有哪几种分别什么特点_第2页
第21讲丨java并发类库提供线程池有哪几种分别什么特点_第3页
第21讲丨java并发类库提供线程池有哪几种分别什么特点_第4页
第21讲丨java并发类库提供线程池有哪几种分别什么特点_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

o),它是一种用来处理大量短时间工作任务的线程池,具有几个鲜明特点:它会试图缓存线程并重用,当无缓存线程可用时,就会创建新的工作线程;如果线程闲置的时间超过0消耗什么资源。其nousQueue作为工作队列。newFixedThreadPool(intnThreads),重用指定数目(nThreads)的线程,其背后使用的是的工作队列,任何时候最多有nThreads个工作线程是活动的。这意味着,如出,将会有新的工作线程被创建,以补足指定的数目nThreads。lhreadExecutor(,操作一个的工作队列,所以它保证了所有任务的都是被顺序执行,最多会有一个任务处于活动状态,并且不允许使用者改动线程池实例,因此可以避免其改变线程数目。newSingleThreadScheduledExecutor()和newScheduledThreadPool(intcorePoolSizeScheduledExecutorService,可以进行定时或周期性的工kPool(intparalm),这是一个经常忽略的线程池,Jaa8才加入这个创建方法,其内部会构建JoinPool,利用Wr-ng算法,并行地处理任务,不保证处理顺序。Java并发包中的Executor框架无疑是并发编程中的重点,今天的题目的是对几种标在大多数应用场景下,使用Executors提供的5个静态工厂方法就足够了,但是仍然可能需要直接利用ThreadPoolExecutor等构造函数创建,这就要求你对线程构造方式有进一另外,线程池这个定义就是个容易让人误解的术语,因为ExecutorService除了通常意义ExecutorExecutorExecutor1voidexecute(RunnableExecutor的设计是源于Java早期线程API使用的教训,开发者在实现应用逻辑时,被太多线程创建、调度等不相关细节所打扰。就像我们进行HTTP通信,如果还需要自己操作TCP握手,开发效率低下,质量也难以保证。ExecutorService则更加完善,不仅提供service的管理功能,比如shutdown等方1<T>Future<T>submit(Callable<T>注意,这个例子输入的可是Callable,它解决了Runnable无法返回结果的困扰。Jaato、heduledThredPoolExecutoJoinPoo。这些线的设计特点在于其高度的的。ThreadPoolExecutor源码。ScheduledThreadPoolExecutor是ThreadPoolExecutor的扩展,主要是增加了调度逻辑,如想深入了解,你可以参考相关。而ForkJoinPool则是为ForkJoinTask定制的线,与通常意义的线有所不同。使用(newFixedThreadPool)那样使用LinkedBlockingQueue1privatefinalBlockingQueue<Runnable>2内部的“线”,这是指保持工作线程的集合,线需要在运行过程中管理线程创建、销毁。例如,对于带缓存的线,当任务压力较大时,线会创建新的工作线程;当业务压力退去,线会在闲置一段时间(默认0秒)后结束线程。privatefinalHashSet<Worker>workers=new线的工作线程被抽象为静态内部类Worker,基于AQS实现。ThreadFactory提供上面所需要的创建线程逻辑。如果任务提交时被,比如线已经处于SHUTDOWN状态,需要为其提供处理逻辑,Java标准库提供了类似ThreadPoolExecutor.Abort等默认实现,也可以按newFixedThreadPoolnThreadsnewCachedThreadPool为0。比,对于newFixedThreadPool,当然就是nThreads,因为其要求是固定大小,而newCachedThreadPool则是Integer.MAX_VALUE。keepAliveTimeTimeUnit,这两个参数指定了额外的线程能够闲置多久,显然有些线workQueue,工作队列,必须是BlockingQueuepublicThreadPoolExecutor(intintlongTimeUnitBlockingQueue<Runnable>ThreadFactoryRejectedExecutionHandler8这里有一个非常有意思的设计,l可以指定线程极限为Integer.MAX_VALUE,但是因为资源限制,这只是个理论值,所以完privatefinalAtomicIntegerctl=newAtomicInteger(ctlOf(RUNNING,//privatestaticfinalintCOUNT_BITS=Integer.SIZE-privatestaticfinalintCOUNT_MASK=(1<<COUNT_BITS)-//线状态,在数字的privatestaticfinalintRUNNING=-1<<…//PackingandunpackingprivatestaticintrunStateOf(intc){returnc&~COUNT_MASK;privatestaticintworkerCountOf(intc){returnc&COUNT_MASK;privatestaticintctlOf(intrs,intwc){returnrs|wc;Jaadoc。注意,实际Jaa代码中并不存在所谓Ide状态,我添加它仅仅是便于理解。前面都是对线属性和构建等方面的分析,下面我选择典型的execute方法,来看看其publicvoidexecute(Runnablecommand)…intc=//检查工作线程数目,低于corePoolSize则添加if(workerCountOf(c)<corePoolSize)if(addWorker(command,c=}//isRunning就是检查线是否被//工作队列可能是有界的,offerif(isRunning(c)&&workQueue.offer(command))intrecheck=if(!isRunning(recheck)&&elseif(workerCountOf(recheck)==addWorker(null, //尝试添加一个worker,如果失败意味着已经饱和或者被shutdownelseif(!addWorker(command,23避免任务堆积。前面我ddPool是创建指定数目的线程,但是其工作队列是的,如果工作线程数目太少,导致处理跟不上入队的速度,这就很有可能占用大量系统内存,甚至是出现OO。诊断时,你可以使用p大量的任务对象入队。避免过度扩展线程。我们通常在处理大量短时任务时,使用缓存的线,比如在的 API中,目前的默认实现就是如此。我们在创建线的时候,并不能准确预计任务压力有多大、数据特征是什么样子(大部分请求是1K、100K还是1M以另外,如果线程数目不断增长(可以使用jstack等工具检查),也需要警惕另外一种可避免死锁等同步问题,对于死锁的场景和排查,你可以复习专栏第18讲。尽量避免在使用线时操作dl,同样是专栏第7讲已经分析过的,通过今天的线学习,应该更能理解其原因,工作线程的生命周期通常都会超过任务的生命周如果我们的任务主要是进行计算,那么就意味着CPU的处理能力是稀缺的资源,我们能够通过大量增加线程数提高计算能力吗?往往是不能的,如果线程太多,反倒可能导致大量的上下文切换开销。所以,这种情况下,通常建议按照CPUNN+1。如果是需要较多等待的任务,例如I/O操作比较多,可以参考BrainGoetz推荐的计算1线程数=CPU核数×目标CPU利用率×(1+平均等待时间/平均工作时间上面是仅仅考虑了CPU等限制,实际还可能受各种系统资源限制影响,例如我最近就在cOSXml端口受限的情况。当然,我是通过扩大可用端口范围解决的,如果我们不能调整资源的容量,那么就只能限制工作线程的数目了。这里的资源可以是文件句柄、内存等。改变更能解决问题,比如利用背压机制的ReactiveStream、合理的拆分等。今天,我从Java创建的几种线开始,对Executor框架的主要组成、线结构与生和生命周期。请谈一谈,如果利用newSingleThreadExecutor()创建一个线,corePoolSize、maxPoolSize等都是什么数值?ThreadFactory可能生命周期中 售卖。页面已增加防盗追踪,将依法其上一 第20讲|并发包中的ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别下一 第22讲|AtomicInteger底层实现原理是什么?如何在自己的产品代码中应用CAS操作Iama 20shutdownNow方法是直接的停掉所有线程。无论是shutdown还是shutdownNow约书 作者回复:三木 7 blockingQueue中存任务,queue满了以后才会创建非线程?是在问,为什么要这么 cachedthreadpool?那个大小是浮动的,不是1;如果说 它创建的是个FinalizableDelegatedExecutorService…镰 1听了一段时间课程,质量很高。我的需求是android作者回复: core/maxsize都是1木 心线程处理时间太长。正常情况下要保证线程数小于线程数,非线程会过一段时不告诉 无论是创建线程还是非线程,都需要获取全局锁。只有在工作队列满了以后才去 老师你好,如果创建一个线,线程数为1,最大线程数为10,现在有100个线程并 老师你好,我在学

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论