微信搜索《Java鱼仔》,每天一个知识点不错过
(一)每天一个知识点
你对线程池的了解有多少?知道为什么阿里不让用Java提供的线程池吗?
(二)回答
2.1 什么是线程池
线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位,我们的程序最终都是由线程进行运作。在Java中,创建和销毁线程的动作是很消耗资源的,因此就出现了所谓“池化资源”技术。线程池是池化资源技术的一个应用,所谓线程池,顾名思义就是预先按某个规定创建若干个可执行线程放入一个容器中(线程池),需要使用的时候从线程池中去取,用完之后不销毁而是放回去,从而减少了线程创建和销毁的次数,达到节约资源的目的。
2.2 为什么要使用线程池
降低资源消耗
前面已经讲到线程池的出现减少了线程创建和销毁的次数,每个线程都可以被重复利用,可执行多个任务。
提高系统的响应速度
每当有任务到来时,直接复用线程池中的线程,而不需要等待新线程的创建,这个动作可以带来响应速度的提升
防止过多的线程搞坏系统
可以根据系统的承受能力,调整线程池中的工作线程的数量,防止因为线程过多服务器变慢或死机。java一个线程默认占用空间为1M,可以想象一旦手动创建线程过多极有可能导致内存溢出。
2.3 如何去创建线程池
JDK提供了四种标准的线程池:newSingleThreadExecutor、newFixedThreadPool、newCachedThreadPool、newScheduledThreadPool
使用这几种线程池只需要用Executors去调用线程池方法即可,调用方式如下:
ExecutorServiceexecutorService=Executors.newSingleThreadExecutor();
2.4 为什么阿里不让用Executors直接生成线程池
JDK提供的四个线程池底层采用的都是ThreadPoolExecutor来生成,因此为了让开发人员更加了解线程池的运行规则,阿里规约约定线程池的操作都需要手动去创建
ThreadPoolExecutorthreadPoolExecutor=newThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.MILLISECONDS, blockingQueue, handler);
ThreadPoolExecutor有核心的七个参数,有关线程池更核心的知识与应用我写了一篇博客,点击下面查看。