前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JDK7并行计算框架介绍二 Fork/Join开发实例

JDK7并行计算框架介绍二 Fork/Join开发实例

作者头像
数据饕餮
发布2019-01-14 16:02:17
3890
发布2019-01-14 16:02:17
举报
文章被收录于专栏:数据饕餮

开发环境:

JDK7.0 + Eclipse3.6 + JUnit4

完整代码:

代码文件一:SortTask.java

package forktest; import java.util.*; import java.util.concurrent.RecursiveAction; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; import junit.*; public class SortTask extends RecursiveAction {     final long[] array;     final int hi;     final int lo;     private int THRESHOLD = 30;     //构造函数     public SortTask(long[] array)     {         this.array = array;         this.lo = 0;         this.hi = array.length - 1;             }     //构造函数     public SortTask(long[] array,int lo,int hi)     {         this.array = array;         this.lo = lo;         this.hi = hi;             }     //implement RecusiveTask must     protected void compute() {         if(hi - lo < THRESHOLD) {             sequentiallySort(array,lo,hi);                      }         else         {               int pivot = partition(array,lo,hi);             System.out.println("\npivot = " + pivot + ", low = " + lo + ", high = " + hi);             System.out.println("array" + Arrays.toString(array));             //注意此处接口有变化,老版本是coInvake,已不支持该接口             invokeAll(new SortTask(array,lo,pivot-1),new SortTask(array,pivot+1,hi));           }     }     //任务分割     private int partition(long[] array,int lo,int hi){         long x = array[hi];         int i = lo - 1;         for (int j = lo; j < hi; j++) {             if (array[j] <= x) {                  i++;                  swap(array, i, j);             }         }         swap(array, i + 1, hi);         return i+1;     }     //执行排序     private void sequentiallySort(long[] array,int lo,int hi){         Arrays.sort(array,lo,hi+1);     }     //数值交换     private void swap(long[] array,int i,int j){         if(i !=j)         {             long tmp = array[i];             array[i] = array[j];             array[j] = tmp;                     }     } }

代码文件二:TestForkJoinSimple.java

package forktest; import junit.*; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.*; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.concurrent.RecursiveAction; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; import forktest.SortTask; public class TestForkJoinSimple {     private static final int NARRAY = 16; //For demo only     long[] array = new long[NARRAY];     Random rand = new Random();     @Before     public void setUp() {         for (int i = 0; i < array.length; i++) {             array[i] = rand.nextLong()%100; //For demo only         }     }     @Test     public void testSort() throws Exception {         ForkJoinTask sort = new SortTask(array);         ForkJoinPool fjpool = new ForkJoinPool();         fjpool.submit(sort);         fjpool.shutdown();         fjpool.awaitTermination(30, TimeUnit.SECONDS);         assertTrue(checkSorted(array));     }     boolean checkSorted(long[] a) {         for (int i = 0; i < a.length - 1; i++) {             if (a[i] > (a[i + 1])) {                 return false;             }         }         return true;     } }

运行结果:

pivot = 5, low = 0, high = 15 array[-88, -97, -25, -33, -25, 10, 62, 91, 43, 85, 35, 26, 57, 78, 66, 79] pivot = 4, low = 0, high = 4 array[-88, -97, -25, -33, -25, 10, 62, 91, 43, 85, 35, 26, 57, 78, 66, 79] pivot = 2, low = 0, high = 3 array[-88, -97, -33, -25, -25, 10, 62, 91, 43, 85, 35, 26, 57, 78, 66, 79] pivot = 0, low = 0, high = 1 array[-97, -88, -33, -25, -25, 10, 62, 91, 43, 85, 35, 26, 57, 78, 66, 79] pivot = 1, low = 1, high = 1 array[-97, -88, -33, -25, -25, 10, 62, 91, 43, 85, 35, 26, 57, 78, 66, 79] pivot = 3, low = 3, high = 3 array[-97, -88, -33, -25, -25, 10, 62, 91, 43, 85, 35, 26, 57, 78, 66, 79] pivot = 13, low = 6, high = 15 array[-97, -88, -33, -25, -25, 10, 62, 43, 35, 26, 57, 78, 66, 79, 91, 85] pivot = 11, low = 6, high = 12 array[-97, -88, -33, -25, -25, 10, 62, 43, 35, 26, 57, 66, 78, 79, 91, 85] pivot = 9, low = 6, high = 10 array[-97, -88, -33, -25, -25, 10, 43, 35, 26, 57, 62, 66, 78, 79, 91, 85] pivot = 6, low = 6, high = 8 array[-97, -88, -33, -25, -25, 10, 26, 35, 43, 57, 62, 66, 78, 79, 91, 85] pivot = 8, low = 7, high = 8 array[-97, -88, -33, -25, -25, 10, 26, 35, 43, 57, 62, 66, 78, 79, 91, 85] pivot = 7, low = 7, high = 7 array[-97, -88, -33, -25, -25, 10, 26, 35, 43, 57, 62, 66, 78, 79, 91, 85] pivot = 10, low = 10, high = 10 array[-97, -88, -33, -25, -25, 10, 26, 35, 43, 57, 62, 66, 78, 79, 91, 85] pivot = 12, low = 12, high = 12 array[-97, -88, -33, -25, -25, 10, 26, 35, 43, 57, 62, 66, 78, 79, 91, 85] pivot = 14, low = 14, high = 15 array[-97, -88, -33, -25, -25, 10, 26, 35, 43, 57, 62, 66, 78, 79, 85, 91] pivot = 15, low = 15, high = 15 array[-97, -88, -33, -25, -25, 10, 26, 35, 43, 57, 62, 66, 78, 79, 85, 91]

注意事项:

JDK版本必须是7.0及以上版本,否则不支持;JUnit必须是4.0及以上版本,否则不支持。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年02月07日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 开发环境:
  • 完整代码:
  • 运行结果:
  • 注意事项:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档