From 86ad93ada50fae1bfad09399ac4e8bc6417b2385 Mon Sep 17 00:00:00 2001 From: Omooo <869759698@qq.com> Date: Fri, 19 Jun 2020 07:40:29 +0800 Subject: [PATCH] =?UTF-8?q?Update=20=E7=BA=BF=E7=A8=8B=E6=B1=A0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blogs/Java/口水话/线程池.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/blogs/Java/口水话/线程池.md b/blogs/Java/口水话/线程池.md index a0fe52f..08fbe10 100644 --- a/blogs/Java/口水话/线程池.md +++ b/blogs/Java/口水话/线程池.md @@ -12,7 +12,12 @@ #### 线程池存在的意义 -线程池存在的意义是降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗,同时能够提高响应速度,当任务到达时,任务可以不需要等到线程创建就能够立即执行,起到缓存线程的效果。这种缓存对象实例的池化思想在 Android 中也有应用,比如 Handler 中使用到的 Message 消息池。 +线程池主要解决了两个问题: + +1. 当执行大量异步任务时线程池能够提供较好的性能,避免线程的频繁创建和销毁。 +2. 提供了一种资源限制和管理的手段,比如可以限制线程的个数,动态新增线程等。 + +这种缓存对象实例的池化思想在 Android 中也有应用,比如 Handler 中使用到的 Message 消息池。 在 Java 中的线程池是用 ThreadPoolExecutor 类来实现的,它的构造方法中有一系列参数需要指定。首先是 corePoolSize 核心线程数量,当有任务通过 execute 方法提交时,如果当前运行的线程数 workCount 小于核心线程数,就新建一个线程去执行任务,如果 workCount 大于等于核心线程数并且队列未满时就扔进队列里面,等待有空闲的线程自己去从队列里面去取然后执行;如果此时队列满了,但是未达到最大线程数,就新建一个线程去执行任务,如果已经达到了最大线程数并且队列满了,就执行拒绝策略。第二个参数就是指定最大线程数,第三个参数是阻塞队列,在任务提交时,如果线程池中的线程数量大于等于 corePoolSize 时,就会把该任务封装成一个 Worker 对象放入等待队列里。在使用 Executors 的 newFixedThreadPool 或 newSingleThreadPool 创建线程池时使用的是 LinkedBlockingQueue,而在使用 newCachedThreadPool 使用的是 SynchronousQueue。但是通常不建议直接使用 Executors 创建线程池,因为 LinkedBlockingQueue 默认大小是 Integer.MAX_VALUE,可能会撑爆内存。第四个参数 keepAliveTime 是非核心线程的存活时间,第五个参数 threadFactory 是用来创建新线程的,默认是 DefaultThreadFactory,在 newThread 里面会设置线程的 group、优先级、是否是守护线程以及线程名称。最后一个参数是拒绝策略,默认是 AbortPolicy 直接抛异常。其次还有其他三个,这四个都定义在了 ThreadPoolExecutor 的内部类中,ThreadPoolExecutor 一共有五个内部类,还有一个就是上面讲到的 Worker。