当前位置: 首页 > news >正文

企业官方网站怎么写家装设计师个人简介

企业官方网站怎么写,家装设计师个人简介,wordpress可以显示歌词,暴富建站Java线程池深度解析#xff0c;从源码到面试热点 一、线程池的核心价值与设计哲学 在开始讨论多线程编程之前#xff0c;可以先思考一个问题#xff1f;多线程编程的原理是什么#xff1f; 我们知道#xff0c;现在的CUP是多核CPU#xff0c;假设你的机器是4核的#x… Java线程池深度解析从源码到面试热点 一、线程池的核心价值与设计哲学 在开始讨论多线程编程之前可以先思考一个问题多线程编程的原理是什么 我们知道现在的CUP是多核CPU假设你的机器是4核的但是只跑了一个线程那么多CUP来说是不是一种资源浪费。 同时这里引出另一个问题是不是单核CUP就只能跑一个线程答案是否多线程的原理是不同的线程占用CUP的时间分片因为一个线程不可能一直处于计算中线程任务里面会包含IO在一个线程进行IO任务的时候可以将CUP交给另一个线程执行。 所以多线程编程的本质是多个线程在CUP的不同时间分片上运行。 在多线程编程中线程的频繁创建和销毁会带来显著的开销。线程池通过资源复用和任务队列管理两大核心机制解决了以下几个问题。 降低资源消耗复用已创建的线程避免频繁的线程创建/销毁。提升响应速度任务到达时可直接执行无需等待线程创建。增强可控性通过队列容量、拒绝策略等手段实现系统过载保护。 Java线程池的核心实现类是ThreadPoolExecutor其设计体现了生产者-消费者模式与资源池化思想的完美结合详细如下。 二、ThreadPoolExecutor源码深度解析 1. 核心参数与构造函数 public ThreadPoolExecutor(int corePoolSize, // 核心线程数即使空闲也不会被回收int maximumPoolSize, // 最大线程数临时线程上限long keepAliveTime, // 空闲线程存活时间TimeUnit unit, // 时间单位BlockingQueueRunnable workQueue, // 任务缓冲队列ThreadFactory threadFactory, // 线程工厂定制线程属性RejectedExecutionHandler handler // 拒绝策略 )参数设计精髓 corePoolSize系统常驻的保底线程应对日常负载。workQueue任务缓冲池常见选择 LinkedBlockingQueue无界队列易导致OOMArrayBlockingQueue有界队列需合理评估容量SynchronousQueue直接传递队列配合最大线程数使用 2. 线程池工作流程源码级解析 execute(Runnable command) 方法流程图 #mermaid-svg-h6zfVtPWLxE3LrDM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-h6zfVtPWLxE3LrDM .error-icon{fill:#552222;}#mermaid-svg-h6zfVtPWLxE3LrDM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-h6zfVtPWLxE3LrDM .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-h6zfVtPWLxE3LrDM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-h6zfVtPWLxE3LrDM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-h6zfVtPWLxE3LrDM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-h6zfVtPWLxE3LrDM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-h6zfVtPWLxE3LrDM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-h6zfVtPWLxE3LrDM .marker.cross{stroke:#333333;}#mermaid-svg-h6zfVtPWLxE3LrDM svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-h6zfVtPWLxE3LrDM .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-h6zfVtPWLxE3LrDM .cluster-label text{fill:#333;}#mermaid-svg-h6zfVtPWLxE3LrDM .cluster-label span{color:#333;}#mermaid-svg-h6zfVtPWLxE3LrDM .label text,#mermaid-svg-h6zfVtPWLxE3LrDM span{fill:#333;color:#333;}#mermaid-svg-h6zfVtPWLxE3LrDM .node rect,#mermaid-svg-h6zfVtPWLxE3LrDM .node circle,#mermaid-svg-h6zfVtPWLxE3LrDM .node ellipse,#mermaid-svg-h6zfVtPWLxE3LrDM .node polygon,#mermaid-svg-h6zfVtPWLxE3LrDM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-h6zfVtPWLxE3LrDM .node .label{text-align:center;}#mermaid-svg-h6zfVtPWLxE3LrDM .node.clickable{cursor:pointer;}#mermaid-svg-h6zfVtPWLxE3LrDM .arrowheadPath{fill:#333333;}#mermaid-svg-h6zfVtPWLxE3LrDM .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-h6zfVtPWLxE3LrDM .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-h6zfVtPWLxE3LrDM .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-h6zfVtPWLxE3LrDM .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-h6zfVtPWLxE3LrDM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-h6zfVtPWLxE3LrDM .cluster text{fill:#333;}#mermaid-svg-h6zfVtPWLxE3LrDM .cluster span{color:#333;}#mermaid-svg-h6zfVtPWLxE3LrDM div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-h6zfVtPWLxE3LrDM :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 未满 已满 未满 已满 未满 已满 提交任务 核心线程是否已满? 创建新核心线程执行 任务队列是否已满? 任务入队等待 最大线程数是否已满? 创建临时线程执行 触发拒绝策略 关键代码片段解析 // 简化版execute方法逻辑 public void execute(Runnable command) {if (command null) throw new NullPointerException();int c ctl.get();if (workerCountOf(c) corePoolSize) { // 优先使用核心线程if (addWorker(command, true)) return;c ctl.get();}if (isRunning(c) workQueue.offer(command)) { // 入队// 双重检查防止线程池已关闭int recheck ctl.get();if (!isRunning(recheck) remove(command))reject(command);else if (workerCountOf(recheck) 0)addWorker(null, false); // 保证至少一个线程处理队列} else if (!addWorker(command, false)) // 尝试创建临时线程reject(command); // 触发拒绝策略 }3. Worker线程的生命周期管理 Worker类设计 private final class Worker extends AbstractQueuedSynchronizer implements Runnable {final Thread thread; // 实际执行线程Runnable firstTask; // 初始任务Worker(Runnable firstTask) {this.firstTask firstTask;this.thread getThreadFactory().newThread(this);}public void run() {runWorker(this); // 进入任务处理循环} }任务执行核心方法runWorker() final void runWorker(Worker w) {Thread wt Thread.currentThread();Runnable task w.firstTask;w.firstTask null;w.unlock(); // 允许中断boolean completedAbruptly true;try {while (task ! null || (task getTask()) ! null) { // 循环获取任务w.lock();if ((runStateAtLeast(ctl.get(), STOP) || (Thread.interrupted() runStateAtLeast(ctl.get(), STOP)))wt.interrupt();try {beforeExecute(wt, task); // 扩展点执行前钩子task.run(); // 实际执行任务afterExecute(task, null); // 扩展点执行后钩子} finally {task null;w.completedTasks;w.unlock();}}completedAbruptly false;} finally {processWorkerExit(w, completedAbruptly); // 线程退出处理} }4. 四种拒绝策略 当线程池无法接受新任务时会触发拒绝策略。JDK提供了四种标准拒绝策略 AbortPolicy: 直接抛出RejectedExecutionException异常默认策略CallerRunsPolicy: 在调用者线程中执行任务DiscardPolicy: 直接丢弃任务不做任何处理DiscardOldestPolicy: 丢弃队列头部的任务然后重试execute 5. JDK提供的线程池 Java通过Executors工厂类提供了几种常用的线程池实现 FixedThreadPool: 固定线程数的线程池 ExecutorService fixedThreadPool Executors.newFixedThreadPool(nThreads);CachedThreadPool: 根据需要创建新线程的线程池 ExecutorService cachedThreadPool Executors.newCachedThreadPool();SingleThreadExecutor: 单线程的线程池 ExecutorService singleThreadExecutor Executors.newSingleThreadExecutor();ScheduledThreadPool: 支持定时及周期性任务执行的线程池 ScheduledExecutorService scheduledThreadPool Executors.newScheduledThreadPool(corePoolSize);三、面试热点问题剖析 3.1 线程池参数如何设置 设置线程池参数需要考虑以下几个因素 CPU密集型任务: 线程数 CPU核心数 1可以最大化CPU利用率IO密集型任务: 线程数 CPU核心数 * (1 平均等待时间/平均工作时间)混合型任务: 需要根据实际情况测试和调整 一个常见的经验公式 线程数 CPU核心数 * (1 平均等待时间/平均计算时间)3.2 为什么不推荐使用Executors创建线程池 虽然Executors提供了便捷的工厂方法但在生产环境中不推荐使用主要原因有 FixedThreadPool和SingleThreadExecutor: 使用了无界队列LinkedBlockingQueue可能导致OOMCachedThreadPool: 最大线程数为Integer.MAX_VALUE可能创建大量线程导致OOMScheduledThreadPool: 同样使用无界队列可能导致OOM 建议通过ThreadPoolExecutor构造函数自定义线程池明确指定各个参数。 3.3 线程池的执行流程是怎样的 当提交任务时如果线程数小于corePoolSize即使有空闲线程也会创建新线程执行任务当线程数大于等于corePoolSize会将任务放入workQueue如果workQueue已满且线程数小于maximumPoolSize会创建新线程执行任务如果workQueue已满且线程数大于等于maximumPoolSize会执行拒绝策略 3.4 线程池的状态转换是怎样的 RUNNING - SHUTDOWN: 调用shutdown()方法(RUNNING or SHUTDOWN) - STOP: 调用shutdownNow()方法SHUTDOWN - TIDYING: 当队列和线程池都为空STOP - TIDYING: 当线程池为空TIDYING - TERMINATED: 当terminated()钩子方法执行完成 3.5 如何优雅地关闭线程池 // 方式1: 使用shutdown()等待所有任务完成 threadPool.shutdown(); try {// 等待所有任务完成最多等待30秒if (!threadPool.awaitTermination(30, TimeUnit.SECONDS)) {// 超时取消正在执行的任务threadPool.shutdownNow();// 等待任务取消的响应if (!threadPool.awaitTermination(30, TimeUnit.SECONDS))System.err.println(线程池未能完全关闭);} } catch (InterruptedException ie) {// 当前线程被中断取消所有任务threadPool.shutdownNow();// 保留中断状态Thread.currentThread().interrupt(); }// 方式2: 直接使用shutdownNow()立即关闭 ListRunnable unfinishedTasks threadPool.shutdownNow();3.6 如何监控线程池的运行状态 ThreadPoolExecutor提供了一些方法来监控线程池状态 // 获取线程池的任务总数 long taskCount threadPool.getTaskCount();// 获取已完成的任务数量 long completedTaskCount threadPool.getCompletedTaskCount();// 获取活跃线程数 int activeCount threadPool.getActiveCount();// 获取线程池大小 int poolSize threadPool.getPoolSize();// 获取曾经达到的最大线程数 int largestPoolSize threadPool.getLargestPoolSize();在实际应用中可以通过扩展ThreadPoolExecutor重写beforeExecute、afterExecute和terminated方法来实现更细粒度的监控。 3.7 如何实现线程池的动态调整 使用ThreadPoolExecutor提供的方法: // 动态调整核心线程数 threadPool.setCorePoolSize(newCoreSize);// 动态调整最大线程数 threadPool.setMaximumPoolSize(newMaxSize);// 动态调整保持时间 threadPool.setKeepAliveTime(time, unit);// 动态调整拒绝策略 threadPool.setRejectedExecutionHandler(newHandler);使用JMX动态调整: 通过将ThreadPoolExecutor包装为MBean可以通过JMX进行动态调整。 4.8 线程池的异常处理机制? 线程池中的异常处理有以下几种方式 使用try-catch捕获异常: threadPool.execute(() - {try {// 任务逻辑} catch (Exception e) {// 异常处理} });使用UncaughtExceptionHandler: ThreadFactory threadFactory new ThreadFactory() {Overridepublic Thread newThread(Runnable r) {Thread t new Thread(r);t.setUncaughtExceptionHandler((thread, throwable) - {// 异常处理逻辑});return t;} };ThreadPoolExecutor executor new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, timeUnit,workQueue, threadFactory, handler);重写afterExecute方法: class MyThreadPoolExecutor extends ThreadPoolExecutor {Overrideprotected void afterExecute(Runnable r, Throwable t) {super.afterExecute(r, t);// 异常处理逻辑} }四、总结 线程池是Java并发编程中非常重要的工具理解其底层实现和工作原理对于高效使用线程池至关重要。 在实际应用中应根据任务特性合理设置线程池参数避免使用Executors提供的工厂方法以防止资源耗尽问题。同时需要做好线程池的监控和异常处理确保应用的稳定运行。
http://www.pierceye.com/news/401351/

相关文章:

  • 建设软件网站七台河新闻直播
  • 深圳 公司网站设计网站建设得花多少钱
  • 社交型网站首页面设计分析宁夏电建网站
  • 网站开发需要掌握的知识中国建设网官方网站
  • 制作网站素材网页设计代码步骤
  • 做微信头图的网站网页编程语言有哪几种
  • 医生工作室网站建设男女激烈做羞羞事网站网站韩剧
  • 网站里面网友点评怎么做网站开发需要资质吗
  • gta 买房网站建设中软件下载免费大全网站
  • 中国移动网站专门拍短视频的公司
  • 网站制作网站建设报价南通优化网站怎么收费
  • 网站的连接二维码怎么做wordpress.org账号
  • 优秀的网站有哪些内容wordpress重新安装删除哪个文件
  • 网站建设与发布需要什么手机端开发app
  • 无锡做网站无锡网站设计2345网址导航手机上网导航下载
  • html中文美食网站营销型网站维护费用
  • 电商网站建设课设用什么软件制作网站
  • 杭州手机网站wordpress随机调用页面
  • html5网站编写长网页网站
  • 订餐网站系统建设方案建一个网上商城需要多少钱
  • 手机网站asp付费抽奖网站怎么做
  • 国际网站哪里做vs2010 c 建设网站
  • 企业网站更新什么内容永城做网站
  • wordpress 众筹网站模板html5风格网站特色
  • 服装设计参考网站重庆景点排名
  • 网至普的营销型网站建设扬州网站商城建设价格表
  • 成品网站价格表简答网站内容建设的时候内链重要性
  • 视频链接生成器某网站搜索引擎优化
  • flash网站案例vi设计是设计什么
  • ip查询网站备案查询企业网络营销推广平台