Java架构学习之线程池使用讲解,java架构线程池
分享于 点击 10481 次 点评:43
Java架构学习之线程池使用讲解,java架构线程池
一、线程池
1、什么是线程池? 答: 经常创建、启动销毁一个线程都是非常消耗时间的。 使用线程池进行管理和复用线程,提高程序效率。 面试答: Java线程池能带来的3个好处: 1、降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 2、提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 3、提高线程的可管理性。线程是稀缺资源,如果无限制地创建, 不仅会消耗系统资源。还会降低系统的稳定性。 使用线程池可以统一分配、调优和监控,但是要合理利用。 Java使用线程核心走的是ThreadPoolExecutor。(构造函数)
二、使用线程池的方式
使用线程池的方式: 使用Executor 封装好的四种线程池类型。 1、newCachodThreadPool创建一个可以缓存线程池,如果线程池长度超过处理需要 ,可灵活回收空闲线程,若无可回收,则新建线程。 2、newFixedThreadPool 创建一个定长的线程池。可控制线程最大并发数,超出的 线程会在队列中等待。 3、newFixedThreadPool 创建一个定长的线程池。 4、newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作 线程来执行任务。
三、线程池合理配置
CPU密集、IO密集。
四、4种创建线程池的方式
newCachedThreadPool 创建可以缓存的线程池
代码:
package com.leeue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * @classDesc: 功能描述:(线程池四种创建方式 newCachedThreadPool 创建可缓存的线程池) * @author: * @Version:v1.0 * @createTime:2018年7月24日 下午2:56:16 */ public class NewCachedThreadPoolDemo { public static void main(String[] args) { // 1、创建可缓存的线程池 可以重复的利用 ExecutorService newCachedThreadPool = Executors.newCachedThreadPool(); for (int i = 0; i < 10; i++) { int temp = i; newCachedThreadPool.execute(new Runnable() { @Override public void run() { System.out.println("ThreadName:" + Thread.currentThread().getName() + " i:" + temp); } }); } } }
显示结果:本来程序是创建10个线程,这里就创建了7个,说明有3个在复用
newFixedThreadPool:创建固定长度的线程池
代码:
package com.leeue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * * @classDesc: 功能描述:(可固定长度的线程池 newFixedThreadPool) * @author:李月 * @Version:v1.0 * @createTime:2018年7月24日 下午3:23:49 */ public class newFixedThreadPoolDemo { public static void main(String[] args) { //快捷键 ctrl+2 +F 来创建变量名 ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(3); for(int i = 0; i < 10; i++) { int temp = i; newFixedThreadPool.execute(new Runnable() { @Override public void run() { System.out.println("ThreadName:"+Thread.currentThread().getName()+" i:"+temp); } }); } } }
显示效果:
newScheduledThreadPool:创建可以定时执行的线程池
代码执行:
package com.leeue; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** * * @classDesc: 功能描述:(创建 可定时的线程池) * @author: * @Version:v1.0 * @createTime:2018年7月24日 下午3:40:54 */ public class NewScheduledThreadPoolDemo { public static void main(String[] args) { ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(3); for(int i = 0; i < 10; i++) { int temp = i; newScheduledThreadPool.schedule(new Runnable() { @Override public void run() { System.out.println("ThreadName:"+Thread.currentThread().getName()+" i:"+temp); } }, 3, TimeUnit.SECONDS);//定时3秒后 执行这个线程池 } } }
显示效果:
newSingleThreadExecutor:单线程池
代码:
package com.leeue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * * @classDesc: 功能描述:(单线程的线程池) * @author: * @Version:v1.0 * @createTime:2018年7月24日 下午3:57:15 */ public class NewSingleThreadScheduledDemo { public static void main(String[] args) { ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor(); for (int i = 0; i < 10; i++) { int temp = i; newSingleThreadExecutor.execute(new Runnable() { @Override public void run() { System.out.println("ThreadName:" + Thread.currentThread().getName() + " i:" + temp); } }); } } }
显示效果
停掉线程池的方法newSingleThreadExecutor.shutdown();//停掉线程池的方法
调用shoutdown()方法。
五、线程池原理分析
面试的时候主要谈:核心线程池、最大线程数。
用户点评