成都网站建设服务公司,全网推广服务,个体户网上注册,wordpress4.9漏洞目录
1、池 1.1、线程池
2、ThreadPoolExecutor 线程池类
3、Executors 工厂类
4、模拟实现线程池 1、池
“池”这个概念见到非常多#xff0c;例如常量池、数据库连接池、线程池、进程池、内存池。 所谓“池”的概念就是#xff1a;#xff08;提高效率#xff09; 1…目录
1、池 1.1、线程池
2、ThreadPoolExecutor 线程池类
3、Executors 工厂类
4、模拟实现线程池 1、池
“池”这个概念见到非常多例如常量池、数据库连接池、线程池、进程池、内存池。 所谓“池”的概念就是提高效率 1、提前把要用的对象准备好 2、用完的对象也不立即释放留着以备下次使用。从而大大降低了线程频繁地创建销毁造成的开销。 1.1、线程池 线程池也是如此提前把要使用的线程在线程池中准备好等到需要用时就从池子里取 出用完之后再归还给池子。 其中取出和归还操作都是属于纯用户态代码这就比内核操作更快更可控 上面提到了用户态什么是用户态呢 设想一个场景你在银行柜台办理业务该业务需要用到身份证复印件此时有两种选择一种是柜员拿着你的身份证帮你去复印一种是你自己去复印。 显然自己去复印这个操作更加可靠并且可控一些。如果交给柜员去复印天知道柜员拿了你的身份证后还去做了什么因为柜员本身需要处理的事情不止有帮你复印身份证这一件事可能在帮你复印身份证的路上去做了别的事情你能做的就只有在柜台前等柜员回来这种操作显然更加不可控。
你自己去操作就相当于用户态而柜员帮你操作就相当于是内核态。
而类比到计算机上简单来说就是
如果一个任务是在用户程序上完成的就属于用户态此时更加的可控。
如果一个任务是通过系统申请创建线程需要由内核来完成就属于内核态此时更加不可控。 2、ThreadPoolExecutor 线程池类 Java 在标准库中提供了 ThreadPoolExecutor 线程池类 corePoolSize核心线程数maximumPoolSize最大线程数keepAliveTime空闲时保持存活的时间针对临时线程的unit存活时间的时间单位sminmshour....workQueue阻塞队列和定时器类似线程池中也可以持有很多个任务threadFactory线程工厂这个类中的方法封装了 new Thread 的操作同时给 Thread 设置了一些属性handler拒绝策略当线程池中的阻塞队列满时继续往队列中添加任务此时线程池会执行什么样的操作就称为拒绝策略
针对拒绝策略又分为四种
1、继续添加任务直接拒绝接收并报错。【直接报错新旧任务都不干了】
2、新的任务由添加任务的线程负责执行。【谁揽的活儿谁干】
3、丢弃最旧的任务新的添加进来。
4、丢弃新来的任务。 3、Executors 工厂类
ThreadPoolExecutor 本身用起来比较复杂因此标准库还把 ThreadPoolExecutor 封装了一层提供了另一个版本。
即 Executors 工厂类通过这个类来创建出不同的线程池对象。
Executors 创建线程池的几种方式
newFixedThreadPool: 创建固定线程数的线程池newCachedThreadPool: 创建线程数目动态增长的线程池.newSingleThreadExecutor: 创建只包含单个线程的线程池.newScheduledThreadPool: 设定 延迟时间后执行命令或者定期执行命令. 是进阶版的 Timer.
public class ExecutorDemo {public static void main(String[] args) {//将线程数设置为 10ExecutorService service Executors.newFixedThreadPool(10);//使用 submit 方法向线程池中提交任务service.submit(new Runnable() {Overridepublic void run() {System.out.println(hello Executors);}});}
}
既然 ThreadPoolExecutor 和 Executors 都可以创建线程池那么到底该用哪个呢 正常情况下直接使用 Executors 工厂类即可当 Executors 工厂类提供的方法无法满足使用时或者是想要高度定制化线程池时才去使用 ThreadPoolExecutor。 4、模拟实现线程池
这里模拟写一个固定线程数目的线程池即模拟使用 newFixedThreadPool 创建的线程池。
分析要点
1、首先需要提供构造方法方法中指定创建多少个线程
2、在构造方法中把这些线程都创建好
3、用一个阻塞队列将要执行的任务保存起来
4、提供 submit 方法用于添加新的任务到阻塞队列中
public class MyThreadPoolExecutor {// 保存线程的集合private ListThread threadList new ArrayList();// 保存任务的阻塞队列private BlockingQueueRunnable queue new ArrayBlockingQueue(1000);public MyThreadPoolExecutor(int n) { //创建n个线程for (int i 0; i n; i) {Thread t new Thread(() - {//这些线程需要做的就是不断从任务队列中取出任务并执行while (true) {try {// take 带有阻塞功能为空时自动阻塞Runnable runnable queue.take();runnable.run();} catch (InterruptedException e) {throw new RuntimeException(e);}}});//启动线程t.start();//将线程存入集合中以备后续使用threadList.add(t);}}//submit 添加新的任务到队列中public void submit(Runnable runnable) throws InterruptedException {queue.put(runnable);}
} 【博主推荐】
【Java多线程】线程中几个常见的属性以及状态-CSDN博客https://blog.csdn.net/zzzzzhxxx/article/details/136122127?spm1001.2014.3001.5501【Java多线程】Thread类的基本用法-CSDN博客https://blog.csdn.net/zzzzzhxxx/article/details/136121421?spm1001.2014.3001.5501【Java多线程】对进程与线程的理解-CSDN博客https://blog.csdn.net/zzzzzhxxx/article/details/136115808?spm1001.2014.3001.5501
如果觉得作者写的不错求给博主一个大大的点赞支持一下你们的支持是我更新的最大动力
如果觉得作者写的不错求给博主一个大大的点赞支持一下你们的支持是我更新的最大动力
如果觉得作者写的不错求给博主一个大大的点赞支持一下你们的支持是我更新的最大动力