国内做外单的网站有哪些,怎么推广业务,企业简介模板免费,市场策划一、线程池
1.1、为什么需要线程池 10年前单核CPU电脑#xff0c;假的多线程#xff0c;像马戏团小丑玩多个球#xff0c;CPU需要来回切换。现在是多核电脑#xff0c;多个线程各自跑在独立的CPU上#xff0c;不用切换效率高。 1.2、优势 线程池做的主要工作是控制运行的…一、线程池
1.1、为什么需要线程池 10年前单核CPU电脑假的多线程像马戏团小丑玩多个球CPU需要来回切换。现在是多核电脑多个线程各自跑在独立的CPU上不用切换效率高。 1.2、优势 线程池做的主要工作是控制运行的线程数量处理过程中将任务放入队列然后在线程创建后启动这些任务如果线程数量超过了最大数量那么超出数量的线程将排队等候等其他线程执行完毕再从队列中取出任务来执行。 1.3、主要特点 线程复用、控制最大并发数、管理线程。 1降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的销耗 2提高响应速度。当任务到达时任务可以不需要等待线程创建就能立即执行 3提高线程的可管理性。线程是稀缺资源如果无限制的创建不仅会销耗系统资源还会降低系统的稳定性使用线程池可以进行统一的分配调优和监控 1.4、架构说明 Java中的线程池是通过Executor框架实现的该框架中用到了ExecutorExecutorsExecutorServiceThreadPoolExecutor这几个类如下所示 1.5、常见的线程池
1.5.1、一池N线程 适用场景执行长期任务性能好创建一个线程池一池有N个固定数量的线程。 说明newFixedThreadPool创建的线程池corePoolSize和maximumPoolSize值是相等的它使用的是LinkedBlockingQueue 1.5.2、一池一线程 适用场景一个任务一个任务的执行一池一线程。 说明newSingleThreadExecutor 创建的线程池corePoolSize和maximumPoolSize值都是1它使用的是LinkedBlockingQueue 1.5.3、可扩容线程 适用场景执行很多短期异步任务线程池根据需要创建新线程可扩容遇强则强。 说明newCachedThreadPool创建的线程池将corePoolSize设置为0将maximumPoolSize设置为Integer.MAX_VALUE它使用的是SynchronousQueue也就是说来了任务就创建线程运行当线程空闲超过60秒就销毁线程。 1.6、 线程池案例
/*** Author : 一叶浮萍归大海* Date: 2023/11/21 8:29* Description: 一个银行网点有10个业务办理窗口周末业务不繁忙开2个窗口业务办理等待区最大能容纳20个人模拟30个人去银行网点办理业务使用线程池处理*/
public class ThreadPoolMainApp {public static void main(String[] args) {ExecutorService pool new ThreadPoolExecutor(2,10,2L,TimeUnit.SECONDS,new ArrayBlockingQueue(20),Executors.defaultThreadFactory(),// new ThreadPoolExecutor.AbortPolicy// new ThreadPoolExecutor.CallerRunsPolicy// new ThreadPoolExecutor.DiscardOldestPolicynew ThreadPoolExecutor.DiscardOldestPolicy());// 30个顾客请求try {for (int i 1; i 30; i) {pool.execute(() - {System.out.println(Thread.currentThread().getName() \t办理业务!);});}} catch (Exception e) {e.printStackTrace();} finally {pool.shutdown();}}} 1.7、ThreadPoolExecutor的底层原理 1.8、线程池7大参数 1.9、线程池的底层工作原理 执行步骤 第一步创建了线程池后开始等待请求 第二步当调用execute()方法添加一个请求任务时线程池会做出如下判断 a、如果正在运行的线程数量小于corePoolSize那么马上创建线程运行这个任务 b、如果正在运行的线程数量大于或者等于corePoolSize那么将这个任务放入队列 c、如果这个时候队列满了且正在运行的线程数量还小于maximumPoolSize那么还是要创建非核心线程立刻运行这个任务 d、如果队列满了且正在运行的线程数量大于或等于maximumPoolSize那么线程池会启动饱和拒绝策略来执行 第三步当一个线程完成任务时它会从队列中取下一个任务来执行 第四步当一个线程无事可做超过一定的时间keepAliveTime时线程会判断 a、如果当前运行的线程数大于corePoolSize那么这个线程就会被线程池回收 b、线程池的所有任务完成后它最终会收缩到corePoolSize的大小 1.10、线程池的拒绝策略
1.10.1、概述 等待队列已经排满了再也塞不下新任务了同时线程池中的max线程也达到了无法继续为新任务服务这个是时候我们就需要拒绝策略机制合理的处理这个问题。 1.10.2、JDK内置的拒绝策略 AbortPolicy(默认)直接抛出RejectedExecutionException异常阻止系统正常运行。 CallerRunsPolicy“调用者运行”一种调节机制该策略既不会抛弃任务也不会抛出异常而是将某些任务回退到调用者从而降低新任务的流量。 DiscardOldestPolicy抛弃队列中等待最久的任务然后把当前任务加人队列中尝试再次提交当前任务。 DiscardPolicy该策略默默地丢弃无法处理的任务不予任何处理也不抛出异常。如果允许任务丢失这是最好的一种策略。 说明以上内置拒绝策略均实现了RejectedExecutionHandle接口 1.11、工作中单一的|固定数的|可变的三种创建线程池的方法哪个用的最多超级大坑 答一个都不用我们工作中只使用自定义的。 Executors中JDK已经给你提供了为什么不用 1.12、工作中如何使用线程池是否自定义过线程池
/*** Author : 一叶浮萍归大海* Date: 2023/11/21 8:29* Description: 一个银行网点有10个业务办理窗口周末业务不繁忙开2个窗口业务办理等待区最大能容纳20个人模拟30个人去银行网点办理业务使用线程池处理*/
public class ThreadPoolMainApp {public static void main(String[] args) {ExecutorService pool new ThreadPoolExecutor(2,10,2L,TimeUnit.SECONDS,new ArrayBlockingQueue(20),Executors.defaultThreadFactory(),// new ThreadPoolExecutor.AbortPolicy// new ThreadPoolExecutor.CallerRunsPolicy// new ThreadPoolExecutor.DiscardOldestPolicynew ThreadPoolExecutor.DiscardOldestPolicy());// 30个顾客请求try {for (int i 1; i 30; i) {pool.execute(() - {System.out.println(Thread.currentThread().getName() \t办理业务!);});}} catch (Exception e) {e.printStackTrace();} finally {pool.shutdown();}}}