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

为什么做这个网站反馈问题小狗做爰网站

为什么做这个网站反馈问题,小狗做爰网站,哈尔滨服务最好的网站优化公司,网页制作与设计元素是什么Java 线程池详解 线程池是Java并发编程的核心组件,它能高效管理线程生命周期,避免频繁创建销毁线程的开销,提升系统性能和资源利用率。 一、线程池核心优势 降低资源消耗:复用已创建的线程,减少线程创建销毁开销提高…

Java 线程池详解

线程池是Java并发编程的核心组件,它能高效管理线程生命周期,避免频繁创建销毁线程的开销,提升系统性能和资源利用率。

一、线程池核心优势

  1. 降低资源消耗:复用已创建的线程,减少线程创建销毁开销
  2. 提高响应速度:任务到达时可直接使用空闲线程执行
  3. 提高线程管理性:统一分配、监控和调优线程资源
  4. 防止资源耗尽:通过队列缓冲和拒绝策略防止系统过载

二、线程池核心实现 - ThreadPoolExecutor

public ThreadPoolExecutor(int corePoolSize,       // 核心线程数int maximumPoolSize,    // 最大线程数long keepAliveTime,     // 非核心线程空闲存活时间TimeUnit unit,          // 时间单位BlockingQueue<Runnable> workQueue,  // 任务队列ThreadFactory threadFactory,        // 线程工厂RejectedExecutionHandler handler    // 拒绝策略
)

核心参数详解

参数说明典型值
corePoolSize常驻核心线程数CPU密集型:N+1
IO密集型:2N+1
maximumPoolSize最大线程数建议200~500(根据场景调整)
keepAliveTime非核心线程空闲存活时间60s
workQueue任务阻塞队列LinkedBlockingQueue
ArrayBlockingQueue
SynchronousQueue
handler拒绝策略AbortPolicy
CallerRunsPolicy
DiscardPolicy
DiscardOldestPolicy

三、Executors工具类创建的线程池类型

1. FixedThreadPool(固定大小线程池)

ExecutorService fixedPool = Executors.newFixedThreadPool(5);
  • 特点:固定核心线程数 = 最大线程数
  • 队列:无界LinkedBlockingQueue
  • 适用场景:负载较重的服务器

2. CachedThreadPool(可缓存线程池)

ExecutorService cachedPool = Executors.newCachedThreadPool();
  • 特点:核心线程数=0,最大线程数=Integer.MAX_VALUE
  • 队列:SynchronousQueue(直接传递队列)
  • 线程回收:60秒空闲后终止
  • 适用场景:大量短生命周期异步任务

3. SingleThreadExecutor(单线程池)

ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();
  • 特点:单工作线程执行
  • 队列:无界LinkedBlockingQueue
  • 适用场景:顺序执行任务

4. ScheduledThreadPool(定时任务线程池)

ScheduledExecutorService scheduledPool = Executors.newScheduledThreadPool(3);
  • 支持定时/周期性任务
  • 核心方法:
    // 延迟执行
    scheduledPool.schedule(task, 5, TimeUnit.SECONDS);// 固定频率执行
    scheduledPool.scheduleAtFixedRate(task, 1, 3, TimeUnit.SECONDS);// 固定延迟执行
    scheduledPool.scheduleWithFixedDelay(task, 1, 2, TimeUnit.SECONDS);
    

四、任务队列类型

队列类型特性适用场景
LinkedBlockingQueue无界队列(默认容量Integer.MAX_VALUE)任务量未知但增长较快
ArrayBlockingQueue有界队列(固定容量)防止资源耗尽
SynchronousQueue不存储元素的阻塞队列直接传递任务
PriorityBlockingQueue优先级队列任务需要按优先级处理

五、拒绝策略

当线程池饱和(队列满+线程数=max)时触发

  1. AbortPolicy(默认策略)

    • 抛出RejectedExecutionException
    • 保证任务不丢失
  2. CallerRunsPolicy

    • 由提交任务的线程直接执行
    • 降低新任务提交速度
  3. DiscardPolicy

    • 静默丢弃无法处理的任务
    • 可能丢失任务
  4. DiscardOldestPolicy

    • 丢弃队列中最旧的任务
    • 尝试重新提交当前任务

六、线程工厂(ThreadFactory)

自定义线程创建行为:

ThreadFactory customFactory = r -> {Thread t = new Thread(r);t.setName("Worker-" + threadCounter.getAndIncrement());t.setDaemon(false);t.setPriority(Thread.NORM_PRIORITY);t.setUncaughtExceptionHandler((th, ex) -> System.err.println("Uncaught in " + th.getName() + ": " + ex));return t;
};

七、线程池工作流程

  1. 提交任务
  2. 核心线程未满 → 创建新线程执行
  3. 核心线程已满 → 任务入队列
  4. 队列已满且线程数<max → 创建非核心线程
  5. 队列满且线程数=max → 触发拒绝策略
提交任务
核心线程 < corePoolSize?
创建核心线程执行
任务队列未满?
任务入队列
线程数 < maximumPoolSize?
创建非核心线程执行
执行拒绝策略

八、线程池监控

通过扩展ThreadPoolExecutor实现监控:

public class MonitorThreadPool extends ThreadPoolExecutor {// 构造函数...@Overrideprotected void beforeExecute(Thread t, Runnable r) {super.beforeExecute(t, r);System.out.println("Task start: " + ((TrackedTask)r).getId());}@Overrideprotected void afterExecute(Runnable r, Throwable t) {super.afterExecute(r, t);System.out.println("Task completed: " + ((TrackedTask)r).getId());}@Overrideprotected void terminated() {super.terminated();System.out.println("ThreadPool terminated");}
}

关键监控指标:

  • getPoolSize():当前线程数
  • getActiveCount():活动线程数
  • getCompletedTaskCount():已完成任务数
  • getQueue().size():队列中任务数

九、最佳实践

1. 线程池大小配置

  • CPU密集型N_cpu + 1
  • IO密集型N_cpu * (1 + WT/ST)
    • WT:等待时间
    • ST:计算时间
    • 通常:2N_cpu ~ 5N_cpu

2. 避免使用无界队列

// 错误示例(可能导致OOM)
ExecutorService pool = new ThreadPoolExecutor(5, 10, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>()  // 无界队列
);// 正确做法(使用有界队列)
BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(1000);

3. 合理设置线程存活时间

// 设置非核心线程空闲30秒后回收
new ThreadPoolExecutor(5, 20, 30, TimeUnit.SECONDS, ...);

4. 自定义拒绝策略

// 自定义拒绝策略:记录日志并重试
RejectedExecutionHandler customHandler = (r, executor) -> {logger.warn("Task rejected, saving for retry: " + r.toString());// 保存任务到持久化存储saveTaskForRetry(r);
};

5. 关闭线程池的正确方式

void shutdownGracefully(ExecutorService pool) {pool.shutdown(); // 拒绝新任务try {if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {pool.shutdownNow(); // 取消正在执行的任务if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {System.err.println("Thread pool did not terminate");}}} catch (InterruptedException e) {pool.shutdownNow();Thread.currentThread().interrupt();}
}

十、线程池常见问题

1. 任务堆积导致OOM

  • 解决方案:使用有界队列 + 合理拒绝策略

2. 线程泄漏

  • 场景:任务抛出未捕获异常导致工作线程终止
  • 解决方案:使用自定义线程工厂设置UncaughtExceptionHandler

3. 死锁

  • 场景:池内任务相互等待
  • 解决方案:避免任务间依赖,增大线程池

4. 资源耗尽

  • 场景:过多线程竞争有限资源
  • 解决方案:使用资源隔离(不同业务用不同线程池)

十一、Spring中的线程池

Spring Boot配置线程池:

@Configuration
public class ThreadPoolConfig {@Bean("taskExecutor")public Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);executor.setMaxPoolSize(10);executor.setQueueCapacity(100);executor.setThreadNamePrefix("Spring-Async-");executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());executor.initialize();return executor;}
}

使用注解:

@Async("taskExecutor")
public void asyncProcess() {// 异步处理逻辑
}

总结

Java线程池最佳实践:

  1. 根据场景选择线程池类型:优先使用ThreadPoolExecutor自定义
  2. 合理配置参数:核心线程数、最大线程数、队列容量
  3. 使用有界队列:防止OOM
  4. 设置合理拒绝策略:保证业务可靠性
  5. 添加监控:了解线程池运行状态
  6. 优雅关闭:确保任务完成和资源释放

对于现代应用,推荐使用更高级的并发工具:

  • CompletableFuture:异步编程
  • ForkJoinPool:分治任务
  • Virtual Threads(Java 19+):轻量级线程

正确使用线程池能显著提升系统吞吐量和稳定性,是Java高性能应用的基石。


文章转载自:

http://jMafWCOh.prsxj.cn
http://7LjHi0xv.prsxj.cn
http://HgG4OEb0.prsxj.cn
http://sDbs8rws.prsxj.cn
http://6CugGKW3.prsxj.cn
http://Sli3G4oZ.prsxj.cn
http://HGB9ZFhh.prsxj.cn
http://5zJLZqSC.prsxj.cn
http://p1tPyuVM.prsxj.cn
http://B5no12ua.prsxj.cn
http://HPj0MHvL.prsxj.cn
http://mAruKv2w.prsxj.cn
http://ITap02k3.prsxj.cn
http://2ncSHIrW.prsxj.cn
http://C2OKTaHu.prsxj.cn
http://VW6eymHA.prsxj.cn
http://X822Hwvb.prsxj.cn
http://u8iU9iYa.prsxj.cn
http://kXVmFJnj.prsxj.cn
http://S3TKH2Nz.prsxj.cn
http://HIuJmIUl.prsxj.cn
http://v35Ouamr.prsxj.cn
http://Lf8lCTCJ.prsxj.cn
http://wIHUkEtq.prsxj.cn
http://moSFTE6b.prsxj.cn
http://Ru03mBdH.prsxj.cn
http://JOffaK7r.prsxj.cn
http://fhyV1p8l.prsxj.cn
http://sy2X8CAG.prsxj.cn
http://NDewHrAd.prsxj.cn
http://www.dtcms.com/wzjs/624913.html

相关文章:

  • 简述网站开发主要步骤河北网络推广系统
  • 宁波网站公司手机如何制作表格
  • 网站建设的主要产品企业网站群建设
  • 网站的分析与设计做网络销售都做什么网站
  • 佛山移动网站建设费用linux 国外网站
  • 免费的建设网站软件wordpress 亚马逊评论
  • 证券公司网站建设方案网站开发毕业设计代做
  • 墨刀网站开发原型图教程网站解除域名绑定
  • 我的世界做壁纸的网站定制网站型网站开发
  • 网站建设 南昌招标wordpress数据库中文
  • 男人与女人做视频网站jsp网站开发技巧
  • 做冷冻食品的网站学网站开发好不好
  • 蒲城县住房和城乡建设局网站网站创意策划方案
  • 网站开发团队分工网站集约化建设管理
  • 郑州企业网站如何建设网站分页设计作用
  • 旅游网站模板大全wordpress国内优化
  • 数据库网站 模板广州市官网网站建设公司
  • 网站建设费用会计入什么费用怎么在网站上加qq
  • 企业网站cms 开源自己做本地视频网站
  • 简洁大方 网站网站设计公司长沙
  • 深圳网站优化排名公司深圳做分销网站设计
  • 自己做的网站注册用户无法收到激活邮箱的邮件哈尔滨互联网公司
  • 南通市住房建设局网站东莞人才招聘网最新招聘2022
  • 专做零食的网站wordpress网站的彻底清理
  • 温州集团网站建设公司整站排名优化公司
  • 公司网站开发方案小说网站快速做排名
  • 微信小程序个人网站开发网站title keywords
  • 湘潭学校网站建设 x磐石网络苏州网站排名推广
  • 网站建设 维护 编程怎么申请商标品牌
  • 企业网站建设过程做网站教程下载