一位热爱技术的立花右京师兄立花左京前言说完了线程池,我们先来说说线程,什么是线程,每个程序都是一个单独的进程,比如QQ,网易Cloud,我们如何理解线程?实际上,一个进程至少包含一个线程作为程序的最小执行单元,比如迅雷同时下载多个文件。线程池为什么要使用线程池?顾名思义,线程池是由多个线程组成的。它的作用是减少线程的建立和销毁。它与数据库连接池具有相同的概念。以减少连接和释放,从而降低消耗,提高效率。适用场景很多朋友都是刚接触多线程,一直没有了解多线程的实际应用。应该应用在哪里?其实多线程是否适用还是要看你的具体业务。比如显示详情页需要80ms。分8步查询不同表的数据,每步耗时10ms。如果是同步执行,则需要顺序执行汇编数据。这时候如果引入多线程查询,返回数据只需要10多ms。创建方法Executors类提供了六种不同的线程池创建方案。参数都是默认方法,最后传给ThreadPoolExecutor实例。这种方法虽然简单方便,但也有缺点。如果开发者不理解或无意中使用,可能会导致OOM。阿里手册也明确规定,不允许直接使用Executors创建线程池,而是使用ThreadPoolExecutor自定义线程池参数。1.Executors第一个出现的是Executors。让我们先展示它的方法。从图中可以看出,它给出了六种创建线程的方式。请按照两组的顺序阅读1。)newCachedThreadPool可缓存的线程池。它的核心线程数是0,但是线程总数是Integer的最大值,也就是说是最大值。它使用SynchronousQueue作为队列,不保留任务,任务到达后直接创建线程,可能会造成OOM。2)newFixedThreadPool定长线程池。它是一个可以控制并发数的线程池。如果任务到达后所有线程都被占用,则将其加入队列。它使用LinkedBlockingQueue作为队列,这是一个无界队列。任务会不断加入队列,可能会造成OOM。3)newScheduledThreadPool调度线程池。您可以设置固定或延迟执行任务。当线程空闲时,会直接使用。如果线程被占用,则会创建一个新线程。它使用DelayedWorkQueue作为队列,可以保证任务只有在时间到了才会执行。4)newSingleThreadExecutor为单线程线程池。创建一个只有一个线程的线程池。如果有多个任务进来,只执行一个,其他的进入等待队列,遵循先进先出的规则。它使用LinkedLockingQueue作为等待队列,可能会导致OOM。5)newSingleThreadScheduledExecutor是一个单线程线程池,用于周期性执行任务。6)newWorkStealingPool工作窃取线程池。如果有线程A和B,一共分配了5个任务,A分配了4个,B分配了1个。如果B执行完任务而A还没有完成,它会主动去找A窃取任务执行。2.ThreadPoolExecutor第二个是ThreadPoolExecutor,可以自定义不同的参数来达到目的,一共有七个参数,依次显示。publicThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,TimeUnitunit,BlockingQueue
