头两天我老弟问我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的新@
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开发提供根本上更快且可...
forkjoin 源码 -- -- geomesa -- spring -- 算法 -- hbase -- 数据库 -- 高并发 [Java Memory Modle内存模型] [指令重排,可见性,原子性,顺序一致性] 并发同步处理 [乐观锁&悲观锁,重入锁&非重入锁,公平锁&非...
Java并发Fork-Join框架原理解析.docx JAVA核心知识整理.pdf JAVA核心知识点整理.pdf Java面试笔记.docx JAVA面试题解惑系列.pdf Java面试题(基础).pdf JVM 实用参数系列 - v1.0.pdf JVM与性能优化知识点整理.pdf ...
ForkJoin框架详解.mp4 同步容器与并发容器.mp4 并发容器CopyOnWriteArrayList原理与使用.mp4 并发容器ConcurrentLinkedQueue原理与使用.mp4 Java中的阻塞队列原理与使用.mp4 实战:简单实现消息队列.mp4 并发容器...
分叉和加入本模块用于测试 Fork And Join ####1.3。 通过 RMI 使用信号量的 JVM 间同步本模块将说明使用运行在 RMI 中的基于信号量的传递管理器来控制多个 JVM 之间的同步。 ####1.4 基于阻塞队列的订单管理系统的...
第45节Fork/Join框架详解00:28:09分钟 | 第46节同步容器与并发容器00:18:44分钟 | 第47节并发容器CopyOnWriteArrayList原理与使用00:15:52分钟 | 第48节并发容器ConcurrentLinkedQueue原理与使用00:31:03分钟 | ...
第45节Fork/Join框架详解00:28:09分钟 | 第46节同步容器与并发容器00:18:44分钟 | 第47节并发容器CopyOnWriteArrayList原理与使用00:15:52分钟 | 第48节并发容器ConcurrentLinkedQueue原理与使用00:31:03分钟 | ...
第45节Fork/Join框架详解00:28:09分钟 | 第46节同步容器与并发容器00:18:44分钟 | 第47节并发容器CopyOnWriteArrayList原理与使用00:15:52分钟 | 第48节并发容器ConcurrentLinkedQueue原理与使用00:31:03分钟 | ...
第45节Fork/Join框架详解00:28:09分钟 | 第46节同步容器与并发容器00:18:44分钟 | 第47节并发容器CopyOnWriteArrayList原理与使用00:15:52分钟 | 第48节并发容器ConcurrentLinkedQueue原理与使用00:31:03分钟 | ...
这意味着您必须实现Fork,Yield,Exit,Exec,Kill和Join系统调用。 这些系统调用的详细规格在下面给出。 对于此分配,您将在userprog目录中处理Nachos的版本。 您还需要编写一些简单的用户应用程序,使用MIPS交叉...
9.3.6fork/join(分支/聚合活动) 31 9.4事件 31 10Transition 31 11state 32 11.1 定义 32 11.2signal方法 33 12task 34 12.1task的执行 34 12.2设置任务执行人 34 12.3通过AssignmentHandler来设置执行人 35 12.4组...
forkjoin 源码 JDK源码学习: Java 容器 ArrayList LinkedList PriorityQueue HashMap LinkedHashMap ConcurrentHashMap J.U.C包 AQS CountDownLatch CyclicBarrier Semaphore ForkJoin FutureTask BlockingQueue ...
未完成模块:阿里Java手册,java8,注解,fork / join,加解密等。 我微信:bysocket01,加入纯技术交流群,成长技术 给教程的开源代码仓库点个Star吧 帮忙分享该系列文章链接给更多的朋友 如果您对Java基础核心类...
84 6.2.1 start(开始活动) 85 6.2.2 state(状态活动) 86 6.2.3 decision(判断活动) 89 6.2.4 fork – join(分支/聚合活动) 97 6.2.5 end(结束活动) 102 6.2.6 task(人工任务活动) 107 6.2.7 sub-process...