`
flashing
  • 浏览: 355056 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

使用Spring轻松实现Fork-Join

 
阅读更多

头两天我老弟问我Fork-Join是怎么个情况,我就简单说了一下。我顺便提了一下,Spring里面@Async会很智能的封装好调用函数然后扔给线程池,你要做的就是简单配置一下线程池。

下面是示例代码,这里只给出代码和结果:

第一种情况,Service类:

@Async
public String test1() {
    String threadName = Thread.currentThread().getName();
    log.error("{}: 1 start", threadName);
    try {
        Thread.sleep(5000L);
    } catch (Exception e){
    }
    log.error("{}: 1 end", threadName);
    return "s1";
}

@Async
public String test2() {
    String threadName = Thread.currentThread().getName();
    log.error("{}: 2 start", threadName);
    try {
        Thread.sleep(2000L);
    } catch (Exception e){
    }
    log.error("{}: 2 end", threadName);
    return "s2";
}

Controller类:

try {
    String threadName = Thread.currentThread().getName();
    log.error("{}: 0 start", threadName);
    PrintWriter out = response.getWriter();
    String f1 = testService.test1();
    String f2 = testService.test2();
    log.error("{}: 0 end {} {}", threadName, f1, f2);

} catch (Exception e) {
}

 

结果是,test1和test2在不同线程被执行,然而对test1和test2的调用,立刻结束,f1和f2都是null。

也就是说,这样可以独立执行两个后台任务,然而并不能等待返回结果,怎样才能得到结果呢?

 

第二种情况,Service类:

@Async
public Future<String> test1() {
    String threadName = Thread.currentThread().getName();
    log.error("{}: 1 start", threadName);
    try {
        Thread.sleep(5000L);
    } catch (Exception e){
    }
    log.error("{}: 1 end", threadName);
    return new AsyncResult<>("s1");
}

@Async
public Future<String> test2() {
    String threadName = Thread.currentThread().getName();
    log.error("{}: 2 start", threadName);
    try {
        Thread.sleep(2000L);
    } catch (Exception e){
    }
    log.error("{}: 2 end", threadName);
    return new AsyncResult<>("s2");
}

 

Controller类:

try {
    String threadName = Thread.currentThread().getName();
    log.error("{}: 0 start", threadName);
    PrintWriter out = response.getWriter();
    Future<String> f1 = testService.test1();
    Future<String> f2 = testService.test2();
    
    log.error("{}: 0 end {} {}", threadName, f1.get(), f2.get());
} catch (Exception e) {
}

 

这样可以正确得到结果。总之就是,Futrue<T>和AsyncResult<T>让调用线程可以join,等待Future结果。

 

 

 

 

分享到:
评论

相关推荐

    基于Java实现的forkjoin并行任务注解工具, 用于springboot项目下对大量数据单线程处理的性能问题

    基于Java实现的forkjoin并行任务注解, 用于解决springboot项目下对大量数据单线程处理的性能问题,通过一个注解将任务进行多线程拆分处理,以提高处理性能。 应用场景 比如有一个List类型的集合list,需要需要对...

    spring-best-practices:Spring异步最佳实践(未维护)

    SpringMVC-最佳实践 功能完善,经过测试的功能完备的Spring 3.2参考应用程序,具有JPA持久性,REST Level-3资源,...异步处理:请求-应答-轮询模式(基于REST的Fork-Join / Future实现) 职位 快取 使用Spring的新@

    spring-framework-3.1.0.M1-with-docs

    3. 支持Java 7的多线程API:利用Java 7的Fork/Join框架,Spring 3.1提供了更高效的并发处理能力,特别适用于大数据量的处理任务。 4. 集成了Groovy脚本支持:开发者可以通过Groovy来编写配置,增加了灵活性,降低了...

    spring3.2参考文档

    3.2版引入了更好的并发控制和异步处理,支持Java 7的Fork/Join框架。 6. **集成测试**:Spring Test模块提供了方便的测试工具,帮助开发者进行单元测试和集成测试。3.2版增强了对Spring MVC测试的支持,包括模拟...

    springboot+mybatis+jdk1.7

    - JDK 1.7引入了一些重要的特性,如try-with-resources语句(自动关闭资源)、钻石操作符()用于泛型实例化、多路返回值(Fork/Join框架)、类型推断增强(钻石运算符)等。 - 虽然JDK 1.7已经较旧,但其稳定性和...

    ForkJoinUtil.java,一个分而治之的框架工具类

    Fork/Join框架的测试demo,含源代码。 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。 我们再通过Fork和Join这两个...

    积分管理系统java源码-knowledge:这是我的知识,包括我所有已知的

    多线程编程、线程池、fork-join、并发编程 annotation 枚举 泛型 反射 字符串和String研究 集合内容,List、Map 文件io和网络io bio、nio和aio 类加载器 常用设计模式 模板模式 单例模式 & 多例模式 代理模式 策略...

    SpringBoot-:来自https的fork

    您可以使用Spring Boot创建独立的Java应用程序,该应用程序可以使用java -jar或更传统的WAR部署来启动。 我们还提供了一个运行Spring脚本的命令行工具。 我们的主要目标是: 为所有Spring开发提供根本上更快且可...

    java挖财(24问)无答案.zip

    - Fork/Join框架和Parallel Streams。 这些知识点涵盖了Java开发的基础到进阶,面试者需要对这些内容有深入理解和实践经验,才能在面试中表现出色。准备时,不仅要理解概念,还要通过实践加深理解,掌握如何在实际...

    CommonJob.zip

    综上所述,"CommonJob.zip" 包含的可能是一个Java实现的通用定时任务解决方案,它能够定期从数据库中获取数据,处理Excel文件,同时利用ForkJoin框架进行并行计算,提升整体处理速度。开发者可以借鉴和学习其中的...

    javaforkjoin源码-gitbook-BAT-interview:本文综合自己在一线互联网工作感悟,经验。记录开源框架的源码解读,数据

    forkjoin 源码 -- -- geomesa -- spring -- 算法 -- hbase -- 数据库 -- 高并发 [Java Memory Modle内存模型] [指令重排,可见性,原子性,顺序一致性] 并发同步处理 [乐观锁&悲观锁,重入锁&非重入锁,公平锁&非...

    Java相关的技术文档保存

    Spring是一个广泛使用的Java企业级应用框架,它简化了开发并鼓励依赖注入和面向切面编程。深入学习Spring涉及: - IoC(Inversion of Control)容器:理解如何通过XML或注解配置实现对象的创建和依赖管理。 - AOP...

    2021最新java面试合集pdf.rar

    Java并发Fork-Join框架原理解析.docx JAVA核心知识整理.pdf JAVA核心知识点整理.pdf Java面试笔记.docx JAVA面试题解惑系列.pdf Java面试题(基础).pdf JVM 实用参数系列 - v1.0.pdf JVM与性能优化知识点整理.pdf ...

    java面试——上海-携程-Java高级.zip

    - Fork/Join框架和Parallel Streams的使用。 5. **设计模式** - 常见的设计模式:单例、工厂、建造者、观察者、适配器、装饰器、代理、桥接、责任链等。 - 模式在实际开发中的应用场景和优缺点分析。 6. **JVM...

    多线程实现脏字及不和谐文字的过滤(高效)

    6. **性能优化**:除了多线程,还可以结合其他优化手段,比如使用哈希表(HashSet)或字典树(Trie)来加速关键词查找,或者使用并行计算框架(如Java的Fork/Join框架)进一步提升性能。 7. **异常处理**:确保每个...

    Java架构面试专题汇总(含答案)和学习笔记.zip

    - Fork/Join框架和Parallel Streams用于并行计算。 5. **JVM** - 内存模型:堆、栈、方法区、本地方法栈、程序计数器的结构与作用。 - 垃圾收集器:不同的GC算法(如Minor GC、Major GC、Full GC)和G1、ZGC等...

    Java核心知识点整理.rar

    - Fork/Join框架与ExecutorService:并行计算和任务调度。 4. **Spring框架** - IoC(控制反转)与DI(依赖注入):理解容器如何管理对象的生命周期。 - AOP(面向切面编程):使用注解或XML配置实现切面,理解...

    feign-demo.7z

    - Feign是一个声明式的Web服务客户端,它的设计灵感来源于Netflix的ForkJoin框架。开发者只需定义好接口,Feign会自动生成实现该接口的HTTP客户端。 - 使用Feign,我们可以以更直观的方式来调用其他服务,就像调用...

    Java面试宝典:包含Redis各种使用场景,分布式事务,分布式锁,DB,异步并发,JVM,微服务组件,常见的设计模式等

    - Fork/Join框架:并行计算,如在大数据处理中。 6. **JVM优化**: - 内存模型:堆、栈、方法区、元空间的理解与调整。 - 垃圾收集器:G1、CMS、Parallel GC等的选择与调优。 - 类加载机制:双亲委派模型及类...

    java面试300讲MD答案课件

    - Fork/Join框架:并行计算和工作窃取算法的理解。 6. **JVM原理**: - 类加载机制:双亲委派模型、类加载器的层次结构。 - 虚拟机内存布局:堆、栈、方法区的结构和作用。 - 类加载过程:加载、验证、准备、...

Global site tag (gtag.js) - Google Analytics