マルチスレッド——1から100までの加算タスクをfork/joinに分割します.

21069 ワード

記事の目次
  • テーマ:マルチスレッドを使って1から100までの加算タスクを実現する
  • .マルチスレッドを使って解決するアプリケーションCountDownLatch
  • .fork/joinを使って
  • を完成する.
    テーマ:マルチスレッドを使って、1から100までの加算タスクを実現します.
    1.マルチスレッドを使って解決する——CountDownLatchを適用する
    /**
     *        1-10000  
     *  CountDownLatch :       ,                   ,              。
     *            CountDownLatch。   countDown()       1,   0  ,await         。
     *   ,          ,await              。
     *       A,      N             ,     CountDownLatch。
     **/
    
    public class Thread_OneToN {
    
        private static int sum = 0;
        private static int idnex = 10000;
    
        //  10      
        private static int thNum = 10;
        //  CountDownLatch        
        private static CountDownLatch countDownLatch;
        private static Lock lock;
    
        public static void main(String[] args) throws InterruptedException {
            countDownLatch = new CountDownLatch(thNum);
            lock = new ReentrantLock();
    
            //           
            int avNum = idnex / thNum;
    
            int left, right;
            for (int i = 1; i <= thNum; i++) {
                left = (i - 1) * avNum + 1;
                right = i * avNum;
                new Thread(new CountThread(left, right)).start();
            }
            //                      
            countDownLatch.await();
    
            System.out.println(Thread.currentThread().getName() + " sum " + sum);
    
        }
    
        //     
        static class CountThread implements Runnable {
    
            private int left;
            private int right;
    
            public CountThread(int left, int right) {
                this.left = left;
                this.right = right;
            }
    
            @Override
            public void run() {
                //              res ,          sum 
                int res = 0;
                for (int i = left; i <= right; i++) {
                    res += i;
                }
                try {
                    //  ,  sum          
                    lock.lock();
                    sum += res;
                    System.out.println(Thread.currentThread().getName() + " -- " + " left " + left + " right " + right + " sum " + sum);
                    //              
                    countDownLatch.countDown();
                } finally {
                    lock.unlock();
                }
            }
        }
    }
    
    2.fork/joinを使って完成します.
    import java.util.concurrent.ForkJoinPool;
    import java.util.concurrent.Future;
    import java.util.concurrent.RecursiveTask;
    
    /**
     * ForkJoin  ,   1  100  
     *
     */
    public class ForkJoinTaskExample extends RecursiveTask<Integer> {
    
        private static final long serialVersionUID = 1L;
    
        public static final int threadsHold = 10;
        private int start;
        private int end;
    
        public ForkJoinTaskExample(int start, int end) {
            this.start = start;
            this.end = end;
        }
    
    	/**
          * compute    RecursiveTask        
         */
        @Override
        protected Integer compute() {
            int sum = 0;
            //            
            boolean canCompute = (end - start) <= threadsHold;
            if (canCompute) {
                for (int i = start; i <= end; i++) {
                    sum += i;
                }
            } else {
                //         ,           
                int middle = (start + end) / 2;
                ForkJoinTaskExample leftTask = new ForkJoinTaskExample(start, middle);
                ForkJoinTaskExample rightTask = new ForkJoinTaskExample(middle + 1, end);
    
                //      
                leftTask.fork();
                rightTask.fork();
    
                //              
                int leftResult = leftTask.join();
                int rightResult = rightTask.join();
    
                //      
                sum = leftResult + rightResult;
            }
            return sum;
        }
    
        public static void main(String[] args) {
            ForkJoinPool forkjoinPool = new ForkJoinPool();
    
            //        
            ForkJoinTaskExample task = new ForkJoinTaskExample(1, 100);
    
            //      
            Future<Integer> result = forkjoinPool.submit(task);
    
            try {
                System.out.printf("result:{%s}", result.get());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }