zoukankan      html  css  js  c++  java
  • Java线程池之ForkJoinPool

     1 import java.io.IOException;
     2 import java.util.Arrays;
     3 import java.util.Random;
     4 import java.util.concurrent.RecursiveAction;
     5 import java.util.concurrent.RecursiveTask;
     6 
     7 /**
     8  * 分割 合并 线程池
     9  * 类似于递归的归并排序,这个是多线程的递归排序
    10  * jdk1.7之后加的
    11  */
    12 public class ForkJoinPool {
    13 
    14     static int[] nums = new int[1000000];
    15     static final int MAX_NUM = 50000;
    16     static Random random = new Random();
    17 
    18     static {
    19         for(int i=0; i<nums.length; i++) {
    20             nums[i] = random.nextInt(100);
    21         }
    22         System.out.println("总和1:" + Arrays.stream(nums).sum());
    23     }
    24 
    25     /**
    26      * ForkJoinPool里面必须是ForkJoinTask,
    27      * 直接继承ForkJoinTask类写起来比较麻烦,
    28      * 可以继承RecursiveAction(无返回值)和RecursiveTask(递归任务,有返回值)
    29      */
    30 //    static class AddTask extends RecursiveAction {
    31 //
    32 //        int start, end;
    33 //
    34 //        public AddTask(int start, int end) {
    35 //            this.start = start;
    36 //            this.end = end;
    37 //        }
    38 //
    39 //        @Override
    40 //        protected void compute() {
    41 //            if(end-start <= MAX_NUM) {
    42 //                long sum = 0L;
    43 //                for(int i=start; i<end; i++) sum += nums[i];
    44 //                System.out.println("from:" + start + " to:" + end + " =" + sum);
    45 //            }else{
    46 //                int middle = start + (end - start) / 2;
    47 //
    48 //                AddTask subTask1 = new AddTask(start, middle);
    49 //                AddTask subTask2 = new AddTask(middle, end);
    50 //                subTask1.fork();
    51 //                subTask2.fork();
    52 //            }
    53 //        }
    54 //    }
    55 
    56     /**
    57      * 有返回值
    58      */
    59     static class AddTask extends RecursiveTask<Long> {
    60 
    61         int start, end;
    62 
    63         public AddTask(int start, int end) {
    64             this.start = start;
    65             this.end = end;
    66         }
    67 
    68         @Override
    69         protected Long compute() {
    70             if(end-start <= MAX_NUM) {
    71                 long sum = 0L;
    72                 for(int i=start; i<end; i++) sum += nums[i];
    73                 System.out.println("from:" + start + " to:" + end + " =" + sum);
    74                 return sum;
    75             }
    76 
    77             int middle = start + (end - start) / 2;
    78             AddTask subTask1 = new AddTask(start, middle);
    79             AddTask subTask2 = new AddTask(middle, end);
    80             subTask1.fork();
    81             subTask2.fork();
    82             return subTask1.join() + subTask2.join();
    83         }
    84     }
    85 
    86     public static void main(String[] args) {
    87 
    88         java.util.concurrent.ForkJoinPool pool = new java.util.concurrent.ForkJoinPool();
    89         AddTask task = new AddTask(0, nums.length);
    90         pool.execute(task);  //精灵线程
    91         System.out.println("总和2:" + task.join());
    92         try {
    93             System.in.read(); //阻塞主线程
    94         } catch (IOException e) {
    95             e.printStackTrace();
    96         }
    97     }
    98 
    99 }
  • 相关阅读:
    percona-toolkit
    美河在线
    http://planet.mysql.com/
    MySQL性能诊断与调优 转
    PDB CDB
    mysql安装三 linux源码安装mysql5.6.22
    Solaris10 下mysql5.5.12的安装
    c# 进程间通信
    C# 进程同步,通信
    有关DotNetBar设计样式和运行时的样式不一致的问题
  • 原文地址:https://www.cnblogs.com/mxh-java/p/12244318.html
Copyright © 2011-2022 走看看