【Java并发编程核心难点】:Future get()异常类型全解析,你真的懂吗?

第一章:Future get()异常类型概述

在并发编程中,`Future` 接口用于表示一个可能还未完成的异步计算任务。调用 `get()` 方法会阻塞当前线程,直到结果返回或发生异常。理解 `get()` 方法可能抛出的异常类型对于构建健壮的并发应用至关重要。

常见异常类型

  • InterruptedException:当等待结果的线程被中断时抛出,通常发生在调用线程调用了 `interrupt()` 方法。
  • ExecutionException:当计算任务本身抛出异常时,`get()` 将此异常包装后抛出,实际异常可通过 `getCause()` 获取。
  • TimeoutException:仅在调用带超时参数的 `get(long timeout, TimeUnit unit)` 时可能发生,表示在指定时间内未获取到结果。

异常处理代码示例


try {
    // 阻塞等待异步任务结果
    String result = future.get(5, TimeUnit.SECONDS);
    System.out.println("结果: " + result);
} catch (InterruptedException e) {
    // 当前线程被中断,应恢复中断状态并退出
    Thread.currentThread().interrupt();
    System.err.println("任务等待被中断");
} catch (ExecutionException e) {
    // 任务执行过程中抛出了异常,需检查 getCause()
    Throwable cause = e.getCause();
    System.err.println("任务执行失败: " + cause.getMessage());
} catch (TimeoutException e) {
    // 超时未完成,可选择取消任务
    future.cancel(true);
    System.err.println("任务超时,已取消");
}

异常类型对比表

异常类型触发条件是否可恢复
InterruptedException等待线程被中断是(需重置中断状态)
ExecutionException任务内部抛出异常视具体业务而定
TimeoutException超过指定等待时间可尝试重试或取消
graph TD A[调用 future.get()] --> B{任务完成?} B -->|是| C[返回结果] B -->|否| D{等待中断?} D -->|是| E[抛出 InterruptedException] D -->|否| F{超时?} F -->|是| G[抛出 TimeoutException] F -->|否| H[继续等待]

第二章:ExecutionException深度解析

2.1 ExecutionException的产生机制与源码剖析

异常触发场景

ExecutionException 通常在使用 Future.get() 获取异步任务结果时抛出,用于封装任务执行过程中发生的受检或运行时异常。其核心设计目的是将底层异常统一向上抛出。

核心源码分析
public class ExecutionException extends Exception {
    public ExecutionException() { }
    
    public ExecutionException(String message) {
        super(message);
    }

    public ExecutionException(Throwable cause) {
        super(cause); // 封装原始异常
    }
}

该异常继承自 Exception,构造器中通过 super(cause) 保留原始异常栈信息,确保可追溯任务内部错误根源。

典型调用链路
  • 线程池提交 Callable 任务
  • 任务执行中抛出异常(如 IOException)
  • JVM 将异常包装为 ExecutionException
  • 调用 get() 时重新抛出

2.2 捕获ExecutionException并提取根本原因

在并发编程中,`ExecutionException` 常由 `Future.get()` 抛出,用于封装任务执行过程中发生的异常。其核心特点是:实际异常被作为原因(cause)嵌套其中,直接捕获外层异常无法定位问题根源。
异常结构解析
`ExecutionException` 的 `getCause()` 方法返回真正的异常实例,例如 `NullPointerException` 或自定义业务异常。忽略此步骤将导致日志中仅记录“任务失败”,而丢失关键调试信息。
典型处理模式
try {
    result = future.get();
} catch (ExecutionException e) {
    Throwable cause = e.getCause();
    if (cause instanceof IllegalArgumentException) {
        // 处理业务逻辑异常
    } else {
        // 处理未预期错误
        throw new RuntimeException("Task failed", cause);
    }
}
上述代码通过 `getCause()` 提取底层异常,实现精准异常分类与响应。参数说明:`future.get()` 阻塞等待结果,一旦任务抛出异常即被封装为 `ExecutionException` 的原因。

2.3 实践:在任务执行中模拟抛出业务异常

在任务调度系统中,合理模拟业务异常有助于验证系统的容错能力。通过主动抛出受检或非受检异常,可测试重试机制、日志记录与告警流程的完整性。
异常模拟场景设计
常见的业务异常包括数据校验失败、远程服务调用超时等。应在关键业务节点插入条件判断,触发特定异常。
if (order.getAmount() <= 0) {
    throw new BusinessException("订单金额必须大于零");
}
上述代码在订单金额非法时抛出业务异常,用于测试事务回滚与用户提示逻辑。
异常分类与处理策略
  • BusinessException:表示业务规则违反,应被捕获并转化为用户友好提示
  • RuntimeException:系统级异常,触发重试或告警
通过精细化异常控制,提升系统健壮性与可维护性。

2.4 ExecutionException与异常链的调试技巧

在并发编程中,ExecutionException 常用于封装任务执行过程中的受检或运行时异常。由于其本质是“异常包装器”,直接捕获后若未深入分析,容易丢失原始错误信息。
异常链的结构解析
ExecutionException 通过 getCause() 暴露底层异常,形成异常链。典型的调用栈如下:
try {
    Future<Result> future = executor.submit(task);
    Result result = future.get(); // 可能抛出 ExecutionException
} catch (ExecutionException e) {
    Throwable cause = e.getCause();
    if (cause instanceof IllegalArgumentException) {
        // 处理业务逻辑异常
    }
}
上述代码中,future.get() 将任务内部抛出的异常封装为 ExecutionException,需通过 getCause() 进行还原。
调试建议清单
  • 始终检查 getCause() 而非仅打印 ExecutionException
  • 在日志中输出完整堆栈轨迹,保留异常链上下文
  • 使用断点调试时,展开 detailMessage 和 cause 字段

2.5 避免吞咽异常:正确处理ExecutionException的最佳实践

在并发编程中,`ExecutionException` 是由 `Future.get()` 抛出的关键异常,封装了任务执行中的真实错误。忽略它会导致问题难以追踪。
不要吞咽异常
始终解包并处理底层异常,避免空 catch 块:
try {
    result = future.get();
} catch (ExecutionException e) {
    Throwable cause = e.getCause();
    if (cause instanceof IllegalArgumentException) {
        // 处理业务逻辑异常
    } else {
        throw new RuntimeException("Task failed", cause);
    }
}
上述代码确保原始异常被保留,便于日志记录与调试。
推荐的异常分类处理策略
  • 业务异常:如参数校验失败,应被捕获并响应用户
  • 系统异常:如网络超时,需触发重试或熔断机制
  • 编程错误:如空指针,应作为运行时异常向上抛出

第三章:InterruptedException实战分析

3.1 中断机制与线程状态的关系详解

在操作系统中,中断机制是驱动线程状态转换的核心动力之一。当外部设备或定时器触发中断时,CPU会暂停当前执行流,转入中断处理程序,从而影响线程的运行状态。
线程状态的典型转换场景
  • 就绪 → 运行:调度器分配CPU时间片,线程开始执行
  • 运行 → 阻塞:线程请求I/O未完成,主动让出CPU
  • 阻塞 → 就绪:中断唤醒等待事件,如数据到达
中断唤醒阻塞线程的代码示意

// 模拟设备中断处理函数
void interrupt_handler() {
    if (event_completed) {
        wake_up(&waiting_queue);  // 唤醒等待队列中的线程
        set_thread_state(thread, THREAD_READY);
    }
}
该代码段展示中断处理如何将线程从“阻塞”状态置为“就绪”。wake_up函数通知调度器,相关资源已就绪,允许线程重新参与调度。

3.2 get()方法如何响应中断请求

在并发编程中,`get()` 方法常用于获取异步任务结果,但若线程在此期间被中断,需正确处理中断状态以避免阻塞。
中断响应机制
当调用 `get()` 时,若当前线程被中断,多数实现会抛出 `InterruptedException`。此时应清理资源并传播中断状态。
try {
    result = future.get(); // 可能被中断
} catch (InterruptedException e) {
    Thread.currentThread().interrupt(); // 恢复中断状态
    throw new RuntimeException("Task interrupted", e);
}
上述代码确保在捕获中断后恢复中断标志,使上层逻辑能继续响应。这符合Java中断协作模型。
典型中断处理流程
  • 调用线程发起 `get()` 请求
  • 目标任务未完成,调用线程进入等待
  • 外部调用 `interrupt()` 触发中断
  • `get()` 抛出 `InterruptedException` 并清理内部状态
  • 用户代码捕获异常并决定后续行为

3.3 实践:中断场景下的资源清理与恢复策略

在分布式系统或长时间运行的任务中,程序可能因信号中断、崩溃或人为终止而异常退出。此时,确保文件句柄、网络连接、锁等资源被正确释放至关重要。
使用 defer 保证清理逻辑执行
func processData() {
    file, err := os.Create("temp.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer func() {
        file.Close()
        os.Remove("temp.txt")
    }()
    // 模拟处理逻辑
    time.Sleep(2 * time.Second)
}
上述代码利用 Go 的 defer 机制,在函数退出前强制执行资源回收,即使发生 panic 也能保障关闭操作被执行。
中断信号的捕获与响应
通过监听 SIGINT 或 SIGTERM,程序可优雅关闭:
  • 注册 signal handler 捕获中断信号
  • 触发预设的清理流程,如断开数据库连接
  • 完成正在进行的关键操作后再退出

第四章:TimeoutException使用场景与优化

4.1 TimeoutException触发条件与超时控制原理

超时异常的典型触发场景
当系统调用外部服务、数据库查询或网络请求未能在预设时间内完成时,会抛出 TimeoutException。常见于高延迟、资源争用或服务不可达的情况。
基于时间限制的控制机制
现代应用常使用如 Future.get(timeout) 或 CompletableFuture 配合超时参数实现控制。例如在 Java 中:

try {
    result = future.get(5, TimeUnit.SECONDS); // 最多等待5秒
} catch (TimeoutException e) {
    log.warn("操作超时,触发降级逻辑");
}
该机制通过监控任务执行时长,一旦超过阈值即中断等待并抛出异常,保障整体响应时间可控。
  • 超时设置需结合业务容忍度与系统负载动态调整
  • 建议配合重试、熔断等策略形成完整的容错体系

4.2 带超时get()调用的典型应用场景

在高并发系统中,避免线程或协程因等待结果而无限阻塞至关重要。带超时的 `get()` 调用通过设定最大等待时间,保障系统的响应性和资源可控性。
服务降级与容错处理
当远程调用依赖服务时,网络延迟或服务不可用可能导致请求堆积。使用超时机制可及时失败并转入备用逻辑:
result, err := cache.Get("key", 100*time.Millisecond)
if err != nil {
    log.Warn("Cache timeout, using default")
    return defaultConfig
}
该代码尝试在100毫秒内从缓存获取配置,超时则返回默认值,防止主线程长时间阻塞。
资源竞争与任务调度
在有限资源池中,任务需在指定时间内获取执行权限:
  • 数据库连接池获取连接
  • 限流器申请令牌
  • 分布式锁抢占
超时机制确保任务不会永久等待,提升整体调度公平性与系统吞吐。

4.3 超时时间设置的合理性与性能权衡

超时设置的影响因素
网络延迟、系统负载和业务逻辑复杂度共同影响超时阈值的选择。过短的超时可能导致频繁重试,增加系统压力;过长则延长故障响应时间。
典型配置示例
client := &http.Client{
    Timeout: 5 * time.Second, // 综合考虑了P99响应时间和网络抖动
}
该配置适用于大多数微服务调用场景,平衡可用性与用户体验。对于批量操作,可提升至15秒并启用分段处理。
参数调整建议
  • 初始值建议设为平均响应时间的3倍
  • 关键路径服务采用动态超时机制
  • 依赖外部API时预留容错缓冲时间

4.4 实践:结合轮询与超时实现健壮的任务等待

在异步任务处理中,直接阻塞等待结果可能导致程序响应迟缓。通过轮询机制定期检查任务状态,可提升灵活性。
轮询与超时的协同设计
引入最大等待时间和间隔周期,避免无限等待。以下为 Go 语言实现示例:
func waitForTask(timeout, interval time.Duration) error {
    ticker := time.NewTicker(interval)
    defer ticker.Stop()

    deadline := time.Now().Add(timeout)
    for {
        select {
        case <-ticker.C:
            if isTaskDone() {
                return nil
            }
            if time.Now().After(deadline) {
                return errors.New("task wait timeout")
            }
        }
    }
}
该函数每 interval 毫秒检查一次任务状态,总等待不超过 timeout。若超时仍未完成,则返回错误。
  • 优点:控制粒度细,资源占用低
  • 适用场景:API 轮询、后台任务监控

第五章:总结与常见误区避坑指南

避免过度设计配置文件结构
在微服务架构中,团队常将配置文件拆分过细,导致维护成本上升。例如,将数据库、缓存、日志分别置于独立配置模块,反而增加了部署复杂度。合理的做法是按环境维度组织配置,如 config-prod.yaml 与 config-staging.yaml,并通过环境变量注入。
  • 使用统一命名规范,如全部小写加中划线
  • 敏感信息通过 Secret 管理,禁止硬编码
  • 优先使用 JSON Schema 进行配置校验
警惕配置热更新的副作用
动态重载配置虽提升灵活性,但可能引发状态不一致。例如,日志级别变更后,部分 goroutine 仍沿用旧的 logger 实例。

// 监听配置变化并安全更新
watcher, _ := fsnotify.NewWatcher()
go func() {
    for event := range watcher.Events {
        if event.Op&fsnotify.Write == fsnotify.Write {
            reloadConfig()
            log.Printf("配置已重载: %s", event.Name)
        }
    }
}()
环境变量与配置中心的优先级混乱
来源优先级适用场景
命令行参数最高临时调试
环境变量高Docker 部署
远程配置中心中多实例同步
本地文件低开发阶段
OsgEarth实战:飞机模型动态轨迹与雷达扫描效果实现详解 本文详细介绍了如何使用OsgEarth实现飞机模型动态轨迹与雷达扫描效果。通过实战案例,讲解了模型加载、路径规划、动态轨迹绘制、飞行姿态计算以及雷达扫描效果的实现方法,并提供了性能优化技巧,帮助开发者高效完成三维可视化项目开发。 阅读详情

相关推荐

Office Tool Plus:正版Office干净部署指南

Office部署是Windows新机配置的关键环节,涉及版本选择、架构匹配、语言支持与合规激活等基础技术问题。其核心原理基于微软官方Office Deployment Tool(ODT)的声明式XML配置机制,通过标准化流程确保安装可复现、可审计、无第三方捆绑。技术价值在于规避官网安装器的版本锁定、架构误配和语言缺失等常见风险,提升部署稳定性与安全性。典型应用场景包括企业批量部署、IT运维标准化、隐私敏感型用户自主安装。本文以Office Tool Plus为实践载体,深入解析ODT底层逻辑、XML配置规范

1185

C++并发编程:深入解析std::future::get()的异常处理机制与最佳实践

在C++并发编程中,异常处理是确保程序健壮性的核心环节。其基本原理在于,当异步任务执行过程中发生错误时,异常需要安全地跨越线程边界进行传递。C++标准库通过std::promise和std::future的共享状态机制实现了这一目标,其中std::exception_ptr扮演了关键角色,它能够捕获并存储任意异常对象的副本。这项技术的核心价值在于,它允许开发者以与同步代码相统一的方式处理异步错误,从而构建出更稳定、更易维护的高性能应用,例如在网络服务、并行计算等场景中管理并发任务。本文聚焦于一个实践中极易被

weixin_30902251的博客 416

腾讯2020 unreal虚幻面试题

解析一下,腾讯的unreal客户端面试题: 1.lua性能优化的方向 申请的内存,是造成卡顿的原因之一,在C++与lua交互中,如果参数或者返回值有类变量,那么这个变量不会再交互的栈中存放数据,而会通过申请内存,再指定在交互,这样就造成卡顿,因此可以通过把C++的对象的每个参数分开单独传递,可以解决问题,当时我们游戏改完这个问题后,整体提升了2帧。 其实,主要是Tick循环中,减少与C++的交互,需要的数据不要每帧都去拿,其次,经常拿的一些数据(比方说主角信息),可以做一个lua缓存,...

qq_17347313的博客 1万+

通俗易懂:什么是Future.get()的阻塞等待?有什么解决方法?

先说说Future。 他是一个interface 也可以理解为一种设计模式。 大致如下:我有一个任务,提交给了Future,Future替我完成这个任务。期间我自己可以去做任何想做的事情。一段时间之后,我就便可以从Future那儿取出结果。就是我之前所理解的异步。 Future提供了三个功能: 判断任务是否完成 isDone(): get results not done: keep waiting?kill it? Future里面有个方法 get 是个阻塞方法。当线程池一次性submit多个任务的时候。

Tech in Pieces 2万+

深入解析NPN与PNP传感器驱动电路的设计逻辑与实战应用

本文深入解析NPN与PNP传感器驱动电路的设计逻辑与实战应用,详细对比两者的电流路径差异和电平变化特性。通过实际案例分享电路设计要点,包括上拉电阻选择、保护二极管配置等,并提供工业应用中的选型策略和常见故障排查指南,帮助工程师优化传感器系统集成。

weixin_42561476的博客 470

一文告诉你:如何在trae中编译运行STM32程序,并让AI帮你修改代码

本文详细介绍了如何将STM32程序从Keil迁移到国产免费工具Trae,并利用AI进行代码修改的全过程。

水滴爬呀爬 4886

Future获取子线程的执行结果

1. Runnable的缺陷 2.Callable 接口 3. Future 类 4.用法1: 线程池的submit方法会回Future对象,6分da

法毅的博客 6124

MIKE 21 教程 2.9 初始条件(Initial Conditions),边界条件Boundary Conditions),解耦(Decoupling)

本节讲解初始条件与边界条件的设置。这两个模块如设置有误则极易出现模型崩溃。

Hello Word 4801

【Java并发】线程池多线程调用 限定超时时间的future.get()串行阻塞式运行

线程池多线程任务调用,串行阻塞式运行,虽然慢但稳妥要求单个线程运行时必须要有超时时间,超时则放弃运行下一个任务这里的实现仅能用,不完善Main.java 运行 运行结果:

锥栗的博客 8537

YOLOv11改进有效系列目录 - 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制 - 针对多尺度、小目标、遮挡、恶劣天气等问题

在一些特定情况下,目标检测任务由于多种因素的影响,变得更加复杂和困难。以下是几类常见的困难目标检测场景:1. 小目标检测定义:小目标检测是指当目标在图像中的占比非常小时,模型需要准确识别和定位这些目标。典型场景包括远程监控、卫星图像分析等。挑战1. 低分辨率:由于目标在图像中占据像素较少,细节缺失,特征提取难度增加。2. 特征不足:小目标缺乏明显的形状和纹理特征,容易被复杂背景淹没。3. 检测难度大:由于小目标与背景之间的对比度较低,误检的几率上升。4. 数据不平衡。

qq_64693987的博客 4万+

题解:AcWing 6051 看病

等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。但医院的排队不同其他排队,因为多数情况下,需要病情严重的人优先看病,所以希望BSNY设计系统时,以病情的严重情况作为优先级,判断接下来谁可以去看病。具体是这样的,最近来医院看病的人越来越多了,因此很多人要排队,只有当空闲时放一批病人看病。的操作,输出此时还在排队人中,优先级最大的患者姓名和优先级。后面没有输入,但需要你输出。

团爸讲算法 589

future.get方法阻塞问题的解决,实现按照任务完成的先后顺序获取任务的结果

1、Future Future模式是多线程设计常用的一种设计模式。Future模式可以理解成:我有一个任务,提交给了Future,Future替我完成这个任务。期间我自己可以去做任何想做的事情。一段时间之后,我就便可以从Future那儿取出结果。 Future提供了三种功能: 判断任务是否完成 能够中断任务 能够获取任务执行的结果 向线程池中提交任务的submit方法不是阻塞方法,而Future...

fourierr的博客 6万+

ROS2入门到精通—— ROS2实战专栏(实时更新)

Nav2专栏介绍

BigDavid123的博客 2370

【Java并发编程核心陷阱】:future get()异常类型全解析与避坑指南

掌握future get()的异常类型处理策略,深入解析InterruptedException与ExecutionException的触发场景与应对方法,涵盖超时控制、任务取消等并发编程核心技巧。提升代码健壮性,避免线程阻塞,值得收藏。

AlgoInk的博客 975

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

深入理解Future.get()异常类型(99%的开发者忽略的关键细节)

掌握future get () 的异常类型处理技巧,避免线程阻塞和程序崩溃。详解InterruptedException与ExecutionException的触发场景、捕获方法及最佳实践,提升并发编程健壮性。深入理解执行异常与中断异常的区别与应对策略,值得收藏。

CompiLume的博客 857

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【专家级Java并发实战】:从源码层面解析Future get()异常类型的触发条件

深入解析Future get()的异常类型触发机制,掌握Java并发编程核心要点。涵盖ExecutionException、CancellationException等异常的产生场景与处理策略,结合源码分析线程任务状态流转。提升多线程异常处理能力,值得收藏。

StepLens的博客 329

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Future.get()异常类型全梳理,轻松应对生产环境超时与中断问题

掌握future get () 的异常类型,轻松应对生产环境超时与中断问题。详解InterruptedException和ExecutionException的触发场景与处理策略,覆盖多线程编程中常见阻塞调用的异常管理方案。提升系统稳定性,值得收藏

SimSolve的博客 459

【并发编程避坑指南】:Future get()三大异常场景还原与优雅处理方案

掌握Future get()异常处理技巧,避免并发编程常见陷阱。深入解析future get()的异常类型及三大典型场景,提供优雅捕获与恢复方案,提升程序健壮性。适用于多线程任务调度与异步结果获取,值得收藏。

QuickSolve的博客 936

C++异步编程:深入解析std::future::get()异常传递机制与实战处理策略

在C++异步编程中,异常处理是确保程序健壮性的核心挑战。std::future作为C++11引入的异步操作结果载体,其get()方法不仅是获取结果的接口,更是线程间异常传递的关键枢纽。当异步任务抛出异常时,异常会被存储在与future关联的共享状态中,直到调用get()时,在调用者线程上下文中被重新抛出。这一机制使得跨线程错误处理成为可能,对于构建高可靠性的并发系统至关重要。在实际工程中,开发者常面临异常丢失、状态管理复杂等难题。通过封装工具函数、结合超时控制、利用std::shared_future等策略

weixin_34082854的博客 647

揭秘Future.get()异常真相:5种常见异常及最佳应对策略

掌握Future.get()异常处理核心技巧,深入解析future get () 的异常类型及其适用场景。涵盖InterruptedException到ExecutionException等5种常见异常及最佳应对策略,提升并发编程稳定性与代码健壮性,值得收藏。

LogicNest的博客 744

Java多线程编程避坑指南(Future get()异常类型完全解读)

掌握Java多线程编程中future get()的异常类型处理技巧,避免程序阻塞与异常失控。详解ExecutionException、CancellationException等常见异常及其适用场景,提供可靠异步任务管理方案。提升代码健壮性,值得收藏

DeepLens的博客 409

JAVA并发编程系列(13)Future、FutureTask异步小王子

一转眼已经完成分享synchronized、volatile、CAS、AQS、ReentrantLock、Semaphore、CountDownLatch、CyclicBarrier、并发锁、Condition、线程池、ThreadLocal等多个核心基础原理和案例剖析。今天分享一个也是非常实用的Future、FutureTask。

拉丁解牛技术专栏 1280

Future.get()阻塞与异常处理,Java高并发编程必须掌握的3大要点

掌握Future.get()阻塞与异常处理技巧,解决高并发编程常见难题。深入解析future get () 的异常类型及应对策略,涵盖超时处理、中断响应和线程安全场景,提升程序健壮性,值得收藏。

VarFlow的博客 1084

【专家级C++并发编程】:future::get()异常未捕获导致资源泄漏?一文终结隐患

深入解析C++ future的get()异常处理机制,避免未捕获异常导致的资源泄漏问题。涵盖多线程并发场景下的正确异常捕获方法与RAII最佳实践,提升程序稳定性。掌握关键防护技巧,值得收藏。

LiteTrans的博客 459

【高并发系统设计必修课】:Future get()异常类型与线程安全的隐秘关联

掌握高并发场景下future get()的异常类型处理,深入解析InterruptedException与ExecutionException的触发机制及线程安全影响。涵盖异步任务异常捕获、资源释放最佳实践,提升系统稳定性。值得收藏

BytePulse的博客 272

【Java开发300个实用技巧】92.Future陷阱get阻塞问题

本文深入探讨了Java中Future.get()方法的阻塞问题及其解决方案。首先,文章分析了Future.get()的工作原理,指出其阻塞特性可能导致线程假死或服务崩溃。接着,文章揭示了未设超时导致的死锁陷阱,并建议使用超时设置来避免此类问题。此外,文章还讨论了异常处理的常见错误,并提供了精准捕获异常类型的解决方案。最后,文章推荐使用CompletableFuture作为终极解决方案,展示了其在异步回调、异常处理链、任务组合和手动完成等方面的优势。通过本文,读者可以更好地理解异步编程中的陷阱,并学习如何优雅

966
上一篇: 【专家级并发编程指南】:精准控制 wait_for 返回状态,避免线程响应延迟
下一篇: C++17 optional reset完全指南(从入门到精通必读)
MessyInk
博客等级 码龄11年 136粉丝 1992原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值