头两天我老弟问我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项目下对大量数据单线程处理的性能问题,通过一个注解将任务进行多线程拆分处理,以提高处理性能。 应用场景 比如有一个List类型的集合list,需要需要对...
SpringMVC-最佳实践 功能完善,经过测试的功能完备的Spring 3.2参考应用程序,具有JPA持久性,REST Level-3资源,...异步处理:请求-应答-轮询模式(基于REST的Fork-Join / Future实现) 职位 快取 使用Spring的新@
3. 支持Java 7的多线程API:利用Java 7的Fork/Join框架,Spring 3.1提供了更高效的并发处理能力,特别适用于大数据量的处理任务。 4. 集成了Groovy脚本支持:开发者可以通过Groovy来编写配置,增加了灵活性,降低了...
3.2版引入了更好的并发控制和异步处理,支持Java 7的Fork/Join框架。 6. **集成测试**:Spring Test模块提供了方便的测试工具,帮助开发者进行单元测试和集成测试。3.2版增强了对Spring MVC测试的支持,包括模拟...
- JDK 1.7引入了一些重要的特性,如try-with-resources语句(自动关闭资源)、钻石操作符()用于泛型实例化、多路返回值(Fork/Join框架)、类型推断增强(钻石运算符)等。 - 虽然JDK 1.7已经较旧,但其稳定性和...
Fork/Join框架的测试demo,含源代码。 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。 我们再通过Fork和Join这两个...
多线程编程、线程池、fork-join、并发编程 annotation 枚举 泛型 反射 字符串和String研究 集合内容,List、Map 文件io和网络io bio、nio和aio 类加载器 常用设计模式 模板模式 单例模式 & 多例模式 代理模式 策略...
您可以使用Spring Boot创建独立的Java应用程序,该应用程序可以使用java -jar或更传统的WAR部署来启动。 我们还提供了一个运行Spring脚本的命令行工具。 我们的主要目标是: 为所有Spring开发提供根本上更快且可...
- Fork/Join框架和Parallel Streams。 这些知识点涵盖了Java开发的基础到进阶,面试者需要对这些内容有深入理解和实践经验,才能在面试中表现出色。准备时,不仅要理解概念,还要通过实践加深理解,掌握如何在实际...
综上所述,"CommonJob.zip" 包含的可能是一个Java实现的通用定时任务解决方案,它能够定期从数据库中获取数据,处理Excel文件,同时利用ForkJoin框架进行并行计算,提升整体处理速度。开发者可以借鉴和学习其中的...
forkjoin 源码 -- -- geomesa -- spring -- 算法 -- hbase -- 数据库 -- 高并发 [Java Memory Modle内存模型] [指令重排,可见性,原子性,顺序一致性] 并发同步处理 [乐观锁&悲观锁,重入锁&非重入锁,公平锁&非...
Spring是一个广泛使用的Java企业级应用框架,它简化了开发并鼓励依赖注入和面向切面编程。深入学习Spring涉及: - IoC(Inversion of Control)容器:理解如何通过XML或注解配置实现对象的创建和依赖管理。 - AOP...
Java并发Fork-Join框架原理解析.docx JAVA核心知识整理.pdf JAVA核心知识点整理.pdf Java面试笔记.docx JAVA面试题解惑系列.pdf Java面试题(基础).pdf JVM 实用参数系列 - v1.0.pdf JVM与性能优化知识点整理.pdf ...
- Fork/Join框架和Parallel Streams的使用。 5. **设计模式** - 常见的设计模式:单例、工厂、建造者、观察者、适配器、装饰器、代理、桥接、责任链等。 - 模式在实际开发中的应用场景和优缺点分析。 6. **JVM...
6. **性能优化**:除了多线程,还可以结合其他优化手段,比如使用哈希表(HashSet)或字典树(Trie)来加速关键词查找,或者使用并行计算框架(如Java的Fork/Join框架)进一步提升性能。 7. **异常处理**:确保每个...
- Fork/Join框架和Parallel Streams用于并行计算。 5. **JVM** - 内存模型:堆、栈、方法区、本地方法栈、程序计数器的结构与作用。 - 垃圾收集器:不同的GC算法(如Minor GC、Major GC、Full GC)和G1、ZGC等...
- Fork/Join框架与ExecutorService:并行计算和任务调度。 4. **Spring框架** - IoC(控制反转)与DI(依赖注入):理解容器如何管理对象的生命周期。 - AOP(面向切面编程):使用注解或XML配置实现切面,理解...
- Feign是一个声明式的Web服务客户端,它的设计灵感来源于Netflix的ForkJoin框架。开发者只需定义好接口,Feign会自动生成实现该接口的HTTP客户端。 - 使用Feign,我们可以以更直观的方式来调用其他服务,就像调用...
- Fork/Join框架:并行计算,如在大数据处理中。 6. **JVM优化**: - 内存模型:堆、栈、方法区、元空间的理解与调整。 - 垃圾收集器:G1、CMS、Parallel GC等的选择与调优。 - 类加载机制:双亲委派模型及类...
- Fork/Join框架:并行计算和工作窃取算法的理解。 6. **JVM原理**: - 类加载机制:双亲委派模型、类加载器的层次结构。 - 虚拟机内存布局:堆、栈、方法区的结构和作用。 - 类加载过程:加载、验证、准备、...