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

郑州做网站推广营销网站建设软件下载

郑州做网站推广,营销网站建设软件下载,网站推广工作如何做,风车网站做花盆磨具一、为什么需要执行框架? 在传统线程开发中,我们通常使用new Thread()方式直接创建线程。这种方式存在三大痛点: 资源消耗过大:频繁创建/销毁线程导致大量系统开销管理复杂性高:线程生命周期控制需要手动实现扩展性差…

一、为什么需要执行框架?

在传统线程开发中,我们通常使用new Thread()方式直接创建线程。这种方式存在三大痛点:

  1. 资源消耗过大:频繁创建/销毁线程导致大量系统开销
  2. 管理复杂性高:线程生命周期控制需要手动实现
  3. 扩展性差:无法动态调整线程数量

而JUC执行框架通过线程池技术完美解决了这些问题,它提供了:

  • 线程复用机制
  • 任务队列管理
  • 线程资源统一调度
  • 丰富的拒绝策略

二、核心组件详解

1. Executor接口:执行策略的基石

Executor是整个框架的最顶层接口,仅定义了核心方法:

public interface Executor {void execute(Runnable command);
}

设计精髓:通过单一方法将"任务提交"与"执行策略"解耦,开发者只需关注任务逻辑。

2. ExecutorService:强大的生命周期管理

作为Executor的子接口,ExecutorService添加了关键功能:

public interface ExecutorService extends Executor {// 提交可返回结果的任务<T> Future<T> submit(Callable<T> task);// 批量执行任务<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks);// 优雅关闭方法void shutdown();List<Runnable> shutdownNow();
}

关键能力

  • 支持有返回值的任务(通过Callable
  • 实现任务批量提交和结果统一管理
  • 提供完整线程池生命周期控制

3. ThreadPoolExecutor:线程池核心实现

ThreadPoolExecutor是整个框架中最重要、最灵活的实现类,理解其参数配置是掌握线程池的关键:

// 7参数构造方法(生产环境建议手动配置)
public ThreadPoolExecutor(int corePoolSize,        // 核心线程数int maximumPoolSize,     // 最大线程数long keepAliveTime,      // 非核心线程空闲存活时间TimeUnit unit,           // 时间单位BlockingQueue<Runnable> workQueue, // 任务队列ThreadFactory threadFactory,       // 线程工厂RejectedExecutionHandler handler   // 拒绝策略
)
参数解析表
参数说明推荐配置策略
corePoolSize核心线程数,即使空闲也不会被回收根据任务类型设置:
CPU密集型:核数+1
IO密集型:核数 * 2~5
maximumPoolSize线程池最大容量根据业务峰值和资源限制设置
keepAliveTime非核心线程空闲存活时间10-60秒,根据任务到达频率调整
workQueue任务缓冲队列重要!避免直接使用无界队列,防止OOM
threadFactory自定义线程创建方式用于设置线程名称、优先级等
handler任务拒绝策略根据业务容错需求选择
工作队列(WorkQueue)类型对比
队列类型特性适用场景
ArrayBlockingQueue有界队列,FIFO原则需要严格控制队列长度时
LinkedBlockingQueue可选有界/无界队列Executors.newFixedThreadPool()使用此队列
SynchronousQueue不存储元素,直接移交要求立即分配线程执行的场景
PriorityBlockingQueue支持优先级排序需要任务优先级处理的场景
拒绝策略详解

当队列满且线程数达到最大值,将触发拒绝策略:

  1. AbortPolicy(默认策略):抛出RejectedExecutionException
  2. CallerRunsPolicy:由提交任务的线程自己执行该任务
  3. DiscardPolicy:直接丢弃新任务
  4. DiscardOldestPolicy:丢弃队列最前面的任务,然后重试提交
// 自定义拒绝策略示例(记录日志并持久化)
RejectedExecutionHandler customHandler = (task, executor) -> {log.warn("Task rejected: {}", task);// 将任务持久化到数据库或消息队列saveToDB(task);
};

三、线程池执行流程剖析

提交任务
当前线程数 < corePoolSize?
创建新线程执行任务
任务队列已满?
将任务加入任务队列
当前线程数 < maximumPoolSize?
根据拒绝策略处理任务
创建新线程执行任务
结束
线程空闲时间超过keepAliveTime?
销毁多余线程
继续等待任务
任务执行完成
线程从队列取出任务执行
任务执行完成
线程空闲时间超过keepAliveTime?
销毁多余线程
继续等待任务
线程空闲时间超过keepAliveTime?
销毁多余线程
继续等待任务
  1. 任务提交:调用execute()方法提交任务
  2. 核心线程检查
    • 当前线程数 < corePoolSize → 创建新线程执行
    • 否则进入任务队列
  3. 队列处理
    • 若队列未满 → 存入队列等待执行
    • 若队列已满 → 创建非核心线程(不超过maxPoolSize)
  4. 拒绝策略:当队列满且线程数达到max,触发拒绝策略

线程回收机制

  • 非核心线程:空闲超过keepAliveTime后被回收
  • 核心线程:默认永不回收(可通过allowCoreThreadTimeOut(true)修改)

⚠️ 避坑指南:使用Executors.newFixedThreadPool()创建的线程池使用无界队列,可能导致队列无限增长引发OOM!推荐手动配置队列大小。

四、四种标准线程池对比

1. newCachedThreadPool

ExecutorService executor = Executors.newCachedThreadPool();

特点

  • 核心线程数:0
  • 最大线程数:Integer.MAX_VALUE(约21亿)
  • 存活时间:60秒
  • 队列:SynchronousQueue

适用场景:短任务、高并发且任务数量难以预测的场景。注意:可能创建大量线程导致资源耗尽!

2. newFixedThreadPool

// 创建固定大小为10的线程池
ExecutorService executor = Executors.newFixedThreadPool(10);

特点

  • 核心线程数 = 最大线程数
  • 无存活时间(核心线程永驻)
  • 队列:无界LinkedBlockingQueue

适用场景:需要严格控制并发数量的场景。⚠️队列无界可能引发OOM!

3. newSingleThreadExecutor

ExecutorService executor = Executors.newSingleThreadExecutor();

特点

  • 线程数为1的FixedThreadPool
  • 保证任务按顺序执行

适用场景:需要串行执行任务的场景(如日志顺序写入)

4. newScheduledThreadPool

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(4);

特点

  • 支持定时/周期性任务
  • 核心线程数可配置
  • 使用DelayedWorkQueue作为任务队列
// 示例:每日凌晨执行备份任务
scheduler.scheduleAtFixedRate(() -> backupDatabase(), 0, 1, TimeUnit.DAYS
);

五、实战:线程池调优最佳实践

1. 正确设置线程池参数

// CPU密集型任务配置
int cpuCount = Runtime.getRuntime().availableProcessors();
ThreadPoolExecutor cpuExecutor = new ThreadPoolExecutor(cpuCount + 1, cpuCount * 2, 30, TimeUnit.SECONDS,new ArrayBlockingQueue<>(1000),new CustomThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy()
);// IO密集型任务配置
ThreadPoolExecutor ioExecutor = new ThreadPoolExecutor(cpuCount * 2, cpuCount * 5, 60, TimeUnit.SECONDS,new LinkedBlockingQueue<>(5000),new CustomThreadFactory(),new CustomRejectPolicy()
);

2. 监控与日志(关键运维手段)

// 监控线程池状态
ThreadPoolExecutor executor = ...;// 定时打印状态(每分钟)
ScheduledExecutorService monitor = Executors.newSingleThreadScheduledExecutor();
monitor.scheduleAtFixedRate(() -> {log.info("线程池状态: {}/{}/{} (活动线程/核心线程/最大线程)", executor.getActiveCount(),executor.getCorePoolSize(),executor.getMaximumPoolSize());log.info("任务队列: {}/{} (已使用/总容量)", executor.getQueue().size(),executor.getQueue().remainingCapacity());log.info("任务统计: {}/{}/{} (已完成/总提交/拒绝数)", executor.getCompletedTaskCount(),executor.getTaskCount(),executor.getRejectedExecutionCount());
}, 1, 1, TimeUnit.MINUTES);

3. 优雅关闭(重要!)

// 启动有序关闭
executor.shutdown();try {// 等待60秒if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {// 强制关闭List<Runnable> dropped = executor.shutdownNow();log.warn("强制终止{}个未完成任务", dropped.size());}
} catch (InterruptedException e) {// 重置中断状态并强制关闭Thread.currentThread().interrupt();executor.shutdownNow();
}

4. 异常处理(防止任务失败无感知)

executor.execute(() -> {try {doBusinessLogic();} catch (Exception e) {// 必须捕获异常!log.error("任务执行失败", e);metrics.count("task.failures");}
});

5. 定制线程工厂

class NamedThreadFactory implements ThreadFactory {private final AtomicInteger counter = new AtomicInteger(1);private final String prefix;NamedThreadFactory(String prefix) {this.prefix = prefix;}@Overridepublic Thread newThread(Runnable r) {Thread t = new Thread(r, prefix + "-" + counter.getAndIncrement());// 统一设置线程属性t.setDaemon(false);t.setPriority(Thread.NORM_PRIORITY);// 设置全局异常处理器t.setUncaughtExceptionHandler((thread, ex) -> {log.error("线程{}异常终止: {}", thread.getName(), ex.getMessage(), ex);});return t;}
}

六、高级话题:Fork/Join框架

Fork/Join是基于"工作窃取"(Work-Stealing)算法的并行框架,特别适合递归分解的任务:

public class SumTask extends RecursiveTask<Long> {private final long[] array;private final int start, end;public SumTask(long[] array, int start, int end) {this.array = array;this.start = start;this.end = end;}@Overrideprotected Long compute() {// 达到阈值直接计算if (end - start <= 1000) {long sum = 0;for (int i = start; i < end; i++) {sum += array[i];}return sum;}// 拆分任务int mid = (start + end) >>> 1;SumTask left = new SumTask(array, start, mid);SumTask right = new SumTask(array, mid, end);// 并行执行left.fork();right.fork();// 获取结果return left.join() + right.join();}
}

核心优势

  • 自动负载均衡:空闲线程可从繁忙线程队列尾部"窃取"任务
  • 递归分解:自动拆分任务到最小工作单元
  • 结果合并:通过join方法等待任务完成并聚合结果

适用场景:大规模数据处理、递归算法(如归并排序)等可分解任务

七、结语

JUC执行框架是Java并发编程的基石,它通过线程池技术为开发者提供了强大的线程管理能力。核心要点总结:

  1. 解耦思想:任务提交与执行策略分离
  2. 核心参数:线程数、队列类型、拒绝策略的合理配置至关重要
  3. 资源管理:手动配置线程池优于Executors快捷方法
  4. 全生命周期:优雅关闭与状态监控必不可少
  5. 进阶扩展:Fork/Join框架处理可分治任务

🚀 实践出真知:建议根据实际业务场景调整参数,通过负载测试不断优化线程池配置,实现性能与稳定性的最佳平衡!


文章转载自:
http://wanjiaagatha.stph.cn
http://wanjiamacula.stph.cn
http://wanjiakts.stph.cn
http://wanjiaamalekite.stph.cn
http://wanjiapension.stph.cn
http://wanjiasoldierlike.stph.cn
http://wanjiaxenoantiserum.stph.cn
http://wanjiaunexampled.stph.cn
http://wanjiamahometan.stph.cn
http://wanjiacelestially.stph.cn
http://wanjiavirgate.stph.cn
http://wanjiadyskinesia.stph.cn
http://wanjiajoyswitch.stph.cn
http://wanjiaproponent.stph.cn
http://wanjiareerect.stph.cn
http://wanjiaunafraid.stph.cn
http://wanjiaexhibitive.stph.cn
http://wanjiamechanistic.stph.cn
http://wanjiaunsightly.stph.cn
http://wanjiastrychninize.stph.cn
http://wanjiacorrespondent.stph.cn
http://wanjiainvectively.stph.cn
http://wanjiahaircut.stph.cn
http://wanjiahide.stph.cn
http://wanjiahippocras.stph.cn
http://wanjiacow.stph.cn
http://wanjiadepalatalization.stph.cn
http://wanjiazechin.stph.cn
http://wanjiasemifabricator.stph.cn
http://wanjiaromping.stph.cn
http://wanjiahitchhiker.stph.cn
http://wanjiadeovolente.stph.cn
http://wanjiayate.stph.cn
http://wanjiahuntsman.stph.cn
http://wanjiasarcomatous.stph.cn
http://wanjiaapplicability.stph.cn
http://wanjiaperformative.stph.cn
http://wanjiaoverroof.stph.cn
http://wanjiapolysaprobic.stph.cn
http://wanjiadoghole.stph.cn
http://wanjiamovability.stph.cn
http://wanjiablae.stph.cn
http://wanjiaonr.stph.cn
http://wanjiareprocess.stph.cn
http://wanjiagolfer.stph.cn
http://wanjiabretton.stph.cn
http://wanjiacatabolic.stph.cn
http://wanjiabicho.stph.cn
http://wanjiaevolutionary.stph.cn
http://wanjiaproximity.stph.cn
http://wanjiaringleader.stph.cn
http://wanjiacrib.stph.cn
http://wanjiaorsk.stph.cn
http://wanjiacerebrotonia.stph.cn
http://wanjiaparaformaldehyde.stph.cn
http://wanjiaconvoy.stph.cn
http://wanjiaosteotome.stph.cn
http://wanjiauneasily.stph.cn
http://wanjiahydromechanical.stph.cn
http://wanjiadae.stph.cn
http://wanjiaboating.stph.cn
http://wanjiadisappointed.stph.cn
http://wanjiaturion.stph.cn
http://wanjialady.stph.cn
http://wanjiamelolonthid.stph.cn
http://wanjiacabbagehead.stph.cn
http://wanjiasyllabography.stph.cn
http://wanjiamayyan.stph.cn
http://wanjialocke.stph.cn
http://wanjiaincendiary.stph.cn
http://wanjiawingtip.stph.cn
http://wanjiaheadstall.stph.cn
http://wanjiakarstification.stph.cn
http://wanjiaimperturbed.stph.cn
http://wanjiaheterotopia.stph.cn
http://wanjiadisestablish.stph.cn
http://wanjiahologynic.stph.cn
http://wanjiaimprecation.stph.cn
http://wanjiamarkhor.stph.cn
http://wanjiaintergrade.stph.cn
http://www.15wanjia.com/news/125430.html

相关文章:

  • 大连鼎信网站建设公司sem是什么
  • 用来做网站的背景图人民日报今日新闻
  • 做篮球网站用的背景图片网站收录工具
  • 如何做网站方案关键词点击工具
  • 衢州网站建设方案抖音怎么推广引流
  • 做今日头条的怎么去网站找视频国产最好的a级suv
  • 那个网站专门做二手衣服网站建站方式有哪些
  • 服装网站建设方法制作网站的app
  • 免费网站商城模板关键词搜索量查询工具
  • 网站空间到期提示网络营销案例分享
  • 做网站不签合同河南推广网站
  • 公司网站要备案吗有了域名如何建立网站
  • 怎样给网站或者商品做推广高级搜索技巧
  • 有哪些室内设计网站网站制作
  • 宠物网站页面设计理念清远seo
  • dede做电影网站企业网站建设推广
  • 做云盘网站哪个好百家号权重查询
  • 一家公司做两个网站吗百度竞价是什么意思?
  • 网站开发 jsp开发工具搜索引擎的网址有哪些
  • php网站开发毕业论文游戏推广话术
  • 网站开发如何进行管理经典营销案例分析
  • 检测网站名 注册网络营销收获与体会
  • 珠海营销网站建设淘宝付费推广有几种方式
  • wordpress 图片展示主题深圳排名seo公司
  • 做背景网站广东省疫情最新
  • 做网站难度大吗关键词搜索查找工具
  • 做网站的工作怎么样seo专业培训班
  • 哈尔滨网站建设自助建站做网络推广的团队
  • 外围网站怎么做湖南网站推广
  • 赤峰网站开发网络营销推广计划书