iis7配置asp网站郑州网站搭建的公司
2026/4/18 10:25:43 网站建设 项目流程
iis7配置asp网站,郑州网站搭建的公司,品牌营销品牌推广,建网站怎么上线在多线程编程中#xff0c;线程池是Java并发编程的核心组件之一。合理使用线程池可以显著提升系统性能#xff0c;降低资源消耗。本文将基于JDK8#xff0c;深入剖析线程池的各个参数含义#xff0c;并详细讲解四种拒绝策略。一、线程池核心参数详解1.1 ThreadPoolExecutor…在多线程编程中线程池是Java并发编程的核心组件之一。合理使用线程池可以显著提升系统性能降低资源消耗。本文将基于JDK8深入剖析线程池的各个参数含义并详细讲解四种拒绝策略。一、线程池核心参数详解1.1 ThreadPoolExecutor构造函数public ThreadPoolExecutor( int corePoolSize, // 核心线程数 int maximumPoolSize, // 最大线程数 long keepAliveTime, // 空闲线程存活时间 TimeUnit unit, // 时间单位 BlockingQueueRunnable workQueue, // 工作队列 ThreadFactory threadFactory, // 线程工厂 RejectedExecutionHandler handler // 拒绝策略处理器 )1.2 各参数详细说明1. corePoolSize核心线程数定义线程池中保持活动状态的最小线程数量特性即使线程处于空闲状态也不会被回收除非设置allowCoreThreadTimeOut(true)此时核心线程空闲超时也会被回收建议根据业务负载特点设置通常设置为CPU密集型任务CPU核心数1IO密集型任务2*CPU核心数2. maximumPoolSize最大线程数定义线程池允许创建的最大线程数量特性当工作队列被占满且核心线程都在忙时会创建新线程直到达到此限制超出核心线程数的线程在空闲时会被回收3. keepAliveTime线程空闲时间定义超出核心线程数的线程在空闲时的最大存活时间与unit配合使用指定时间单位秒、毫秒等作用控制线程池中线程的数量避免资源浪费4. unit线程空闲时间单位定义超出核心线程数的线程在空闲时的最大存活时间与keepAliveTime配合使用指定时间作用控制线程池中线程的数量避免资源浪费5. workQueue工作队列用于存放等待执行的任务常见实现类队列类型特点适用场景ArrayBlockingQueue有界队列FIFO任务量可控防止资源耗尽LinkedBlockingQueue可选有界/无界FIFO默认无界任务量大但执行慢SynchronousQueue不存储元素直接传递高吞吐量任务处理快PriorityBlockingQueue优先级队列需要按优先级执行任务6. threadFactory线程工厂作用创建新线程自定义可设置线程名称、优先级、是否为守护线程等默认实现Executors.defaultThreadFactory()7. handler拒绝策略触发条件当线程池已关闭或工作队列和线程池都被占满时策略有四种内置拒绝策略下文详细讲解二、线程池执行流程// 线程池执行任务的核心流程 1. 提交任务到线程池 2. 如果当前线程数 corePoolSize创建新线程执行任务 3. 如果线程数 corePoolSize将任务放入workQueue 4. 如果workQueue已被占满且线程数 maximumPoolSize创建新线程执行任务 5. 如果workQueue已被占满且线程数 maximumPoolSize执行拒绝策略三、四种拒绝策略详解3.1 AbortPolicy默认策略/** * 抛出RejectedExecutionException异常 * 适合需要明确知道任务被拒绝的场景 */ public static class AbortPolicy implements RejectedExecutionHandler { public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { throw new RejectedExecutionException( Task r.toString() rejected from e.toString()); } }特点直接抛出异常任务不会被执行调用者可以捕获异常进行相应处理适合场景对任务执行有严格要求需要知道每个任务是否成功提交3.2 CallerRunsPolicy/** * 由提交任务的线程直接执行被拒绝的任务 * 相当于让调用者自己干 */ public static class CallerRunsPolicy implements RejectedExecutionHandler { public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { if (!e.isShutdown()) { r.run(); // 直接在调用者线程中运行 } } }特点任务不会丢失但会阻塞提交任务的线程起到简单的反馈调节作用降低新任务提交速度适合场景不希望丢失任务且可以接受任务执行速度变慢3.3 DiscardOldestPolicy/** * 丢弃队列中最旧的任务然后重新提交当前任务 */ public static class DiscardOldestPolicy implements RejectedExecutionHandler { public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { if (!e.isShutdown()) { e.getQueue().poll(); // 移除队列头部的任务 e.execute(r); // 重新尝试执行当前任务 } } }特点丢弃等待时间最长的任务可能丢失重要任务适合场景新任务比旧任务更重要可以接受丢失部分旧任务3.4 DiscardPolicy/** * 静默丢弃被拒绝的任务 * 不做任何处理就像什么都没发生 */ public static class DiscardPolicy implements RejectedExecutionHandler { public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { // 什么都不做直接丢弃任务 } }特点任务被静默丢弃无任何提示可能导致任务丢失而不自知适合场景对任务完成率要求不高允许丢失任务四、拒绝策略对比与选择策略是否抛出异常是否丢失任务适用场景AbortPolicy✓✓需要明确知道任务被拒绝对任务完整性要求高CallerRunsPolicy✗✗不允许任务丢失可以接受性能下降DiscardOldestPolicy✗✓新任务比旧任务重要可丢弃等待时间长的任务DiscardPolicy✗✓允许丢失部分任务如日志记录等非关键任务五、实际应用示例5.1 自定义线程池配置public class ThreadPoolExample { public static void main(String[] args) { // 创建自定义线程池 ThreadPoolExecutor executor new ThreadPoolExecutor( 2, // corePoolSize 5, // maximumPoolSize 60, // keepAliveTime TimeUnit.SECONDS, // unit new ArrayBlockingQueue(10), // workQueue new CustomThreadFactory(), // threadFactory new CustomRejectedExecutionHandler() // handler ); // 设置核心线程空闲超时 executor.allowCoreThreadTimeOut(true); // 提交任务 for (int i 0; i 20; i) { final int taskId i; executor.execute(() - { System.out.println(执行任务: taskId , 线程: Thread.currentThread().getName()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }); } // 优雅关闭 executor.shutdown(); } } // 自定义线程工厂 class CustomThreadFactory implements ThreadFactory { private AtomicInteger threadNumber new AtomicInteger(1); Override public Thread newThread(Runnable r) { Thread t new Thread(r, custom-pool- threadNumber.getAndIncrement()); if (t.isDaemon()) { t.setDaemon(false); } if (t.getPriority() ! Thread.NORM_PRIORITY) { t.setPriority(Thread.NORM_PRIORITY); } return t; } } // 自定义拒绝策略 class CustomRejectedExecutionHandler implements RejectedExecutionHandler { Override public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { // 记录日志 System.err.println(任务被拒绝: r.toString()); // 发送告警 sendAlert(); // 可以根据需要选择其他处理方式 } private void sendAlert() { // 发送告警逻辑 } }六、最佳实践与注意事项6.1 最佳实践明确任务类型区分CPU密集型和IO密集型配置不同参数合理设置队列大小避免OOM考虑内存限制监控线程池状态定期监控活跃线程数、队列大小等指标优雅关闭使用shutdown()或shutdownNow()配合awaitTermination()6.2 常见陷阱无界队列风险LinkedBlockingQueue默认无界可能导致OOM不合理的拒绝策略错误选择可能导致任务丢失或系统不稳定忽略线程工厂线程命名不规范会增加问题排查难度6.3 监控与调优// 监控线程池状态 public void monitorThreadPool(ThreadPoolExecutor executor) { System.out.println(核心线程数: executor.getCorePoolSize()); System.out.println(当前线程数: executor.getPoolSize()); System.out.println(活跃线程数: executor.getActiveCount()); System.out.println(最大线程数: executor.getMaximumPoolSize()); System.out.println(任务总数: executor.getTaskCount()); System.out.println(已完成任务数: executor.getCompletedTaskCount()); System.out.println(队列大小: executor.getQueue().size()); }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询