并发多线程部分问题解析

好吧我只是试试水,这篇基本上就是从并发编程的艺术这本书摘录出来的(之后的文章会贴出源码分析,以及更多的理解,欢迎来锤!!!)

线程池原理,为什么要创建线程池?创建线程池的方式;

先说一下线程池的组成部分--

        一个线程池包括以下四个基本组成部分:

                1、线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务;

                2、工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;

                3、任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执 行完后的收尾工作,任务的执行状态等;

                4、任务队列(taskQueue):用于存放没有处理的任务。提供一种缓冲机制。

原理:其实就是这个图(截自java并发编程艺术这本书)

并发多线程部分问题解析_第1张图片

 

            1)线程池判断核心线程池里的线程是否都在执行任务。如果不是,则创建一个新的工作线程来执行任务。如果核心线程池里的线程都在执行任务,则进入下个流程。

            2)线程池判断工作队列是否已经满。如果工作队列没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了,则进入下个流程。

            3)线程池判断线程池的线程是否都处于工作状态。如果没有,则创建一个新的工作线程 来执行任务。如果已经满了,则交给饱和策略来处理这个任务。

为什么创建线程池:(肯定是为了减少消耗,那么减少哪里?)

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

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

 创建线程池的方式 :(最直观的这样)  

     new  ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, milliseconds,runnableTaskQueue, handler);

 (好吧,其实有四种方式创建,根据自己业务需求创建)

 1. newSingleThreadExecutor

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

        2.newFixedThreadPool

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

        3. newCachedThreadPool

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

        4.newScheduledThreadPool

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

 

(好吧第一次写,不对的地方指出一下,下一篇文章会根据实际情况,解析一下如何合理配置线程池(对于CPU密集和IO密集着如何配置,为什么这么配置))

你可能感兴趣的:(n')