1.Fork和Join简介
Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。
Fork:把一个大任务分成若干个子任务进行执行,设置一个阀值,判断任务数量,如果超越阀值,无线分割下去
Join:合并子任务获得最终结果
例子:1+2+3+...+9999+10000,通过Fork将其分成10分,每份计算1000个数的加法运算
流程图:
2.工作窃取算法:
简单的来讲 就是 讲一个大任务切分成若干份小任务,每个任务放入到不同的队列当中,每个队列有一个相应的工作线程来执行这些任务,当这些线程执行完当前的任务,线程闲置,为了提高效率以及避免浪费资源,利用这些线程窃取其他队列中的任务来执行已达到高效的目的
队列一般设置成双端队列:当前队列中的线程从队列的首端获取任务执行,而窃取的线程从队列的尾端获取任务执行,这种方式也有缺点,当队列中只有一个任务的时候,会造成资源竞争以及创建多个双端队列
3.Fork和Join两个主要的类
--ForkJoinTask
创建forkjoin任务,此类在任务中执行fork和join操作的机制,通常继承他的两个子类
--RecursiveAction(没有返回结果)
--RecursiveTask(有返回结果)
--ForkJoinPool
任务需要通过此类来执行,人物分割出来的子任务会添加到当前的工作线程所维护的双端队列中,进入队列的头部。当一个工作线程的队列里暂时没有任务时,他会随机从其他工作线程的队列的尾部获取任务
为什么要是用fork/join框架?
--多核处理器的执行效率
--普通的多线程相对复杂
--高效利用多核平台硬件
--避免死锁(死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程)
4.举例
--使用fork/join计算1+2+3+4+5+6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
|
5.站长所在公司使用forkjoin的封装,其实也是forkjoin的原理改装
生成大量优惠券(适配器模式)
首先,创建fork的接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|
实现接口实现计算的封装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
|
封装工具类,调用ListParamMethod
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
|
优惠券生成入库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
|