码迷,mamicode.com
首页 > 编程语言 > 详细

并发编程(2)--线程的并发工具类

时间:2020-01-31 14:14:19      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:end   pack   上下   import   inf   vat   rand   上下文   形式   

1、线程的并发工具类

Fork-Join

什么是分而治之?

规模为N的问题,N<阈值,直接解决,N>阈值,将N分解为K个小规模子问题,子问题互相对立,与原问题形式相同,将子问题的解合并得到原问题的解

动态规范

工作密取

workStealing

 

Fork/Join使用的标准范式

 技术图片

 

 技术图片

 

 下面演示第一种用法:由于上下文切换的原因,所以性能上有可能不如单线程效果好。

package com.xiangxue.ch2.forkjoin.sum;

import java.util.Random;

/**
 * @author mark
 *产生整形数组
 */
public class MakeArray {
    //数组长度
    public static final int ARRAY_LENGTH  = 100000000;

    public static int[] makeArray() {

        //new一个随机数发生器
        Random r = new Random();
        int[] result = new int[ARRAY_LENGTH];
        for(int i=0;i<ARRAY_LENGTH;i++){
            //用随机数填充数组
            result[i] =  r.nextInt(ARRAY_LENGTH*3);
        }
        return result;

    }
}
package com.xiangxue.ch2.forkjoin.sum;

import com.xiangxue.tools.SleepTools;

public class SumNormal {
    
    public static void main(String[] args) {
        int count = 0;
        int[] src = MakeArray.makeArray();

        long start = System.currentTimeMillis();
        for(int i= 0;i<src.length;i++){
            //SleepTools.ms(1);
            count = count + src[i];
        }
        System.out.println("The count is "+count
                +" spend time:"+(System.currentTimeMillis()-start)+"ms");        
    }

}
package com.xiangxue.ch2.forkjoin.sum;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;

import com.xiangxue.tools.SleepTools;

public class SumArray {
    private static class SumTask extends RecursiveTask<Integer>{

        private final static int THRESHOLD = MakeArray.ARRAY_LENGTH/10;
        private int[] src; //表示我们要实际统计的数组
        private int fromIndex;//开始统计的下标
        private int toIndex;//统计到哪里结束的下标

        public SumTask(int[] src, int fromIndex, int toIndex) {
            this.src = src;
            this.fromIndex = fromIndex;
            this.toIndex = toIndex;
        }

        @Override
        protected Integer compute() {
            if(toIndex-fromIndex < THRESHOLD) {
                int count = 0;
                for(int i=fromIndex;i<=toIndex;i++) {
                    //SleepTools.ms(1);
                    count = count + src[i];
                }
                return count;
            }else {
                //fromIndex....mid....toIndex
                //1...................70....100
                int mid = (fromIndex+toIndex)/2;
                SumTask left = new SumTask(src,fromIndex,mid);
                SumTask right = new SumTask(src,mid+1,toIndex);
                invokeAll(left,right);
                return left.join()+right.join();
            }
        }
    }


    public static void main(String[] args) {

        ForkJoinPool pool = new ForkJoinPool();
        int[] src = MakeArray.makeArray();

        SumTask innerFind = new SumTask(src,0,src.length-1);

        long start = System.currentTimeMillis();

        pool.invoke(innerFind);//同步调用
        System.out.println("Task is Running.....");

        System.out.println("The count is "+innerFind.join()
                +" spend time:"+(System.currentTimeMillis()-start)+"ms");

    }
}

 技术图片

 

 IO密集型--》使用多线程

 

 

常用的并发工具类

CountDownLatch

作用是一线程等待其他的线程完成工作以后在执行加强版join

await用来等待,countDown负责计数器的减一

CyclicBarrier

让一组线程达到某个屏障,被阻塞,一直到组内最后一个线程达到屏障时,屏障开放,所有被阻塞的线程会继续运行CyclicBarrier(int parties)

CyclicBarrier(int parties, Runnable barrierAction),屏障开放,barrierAction定义的任务会执行

CountDownLatchCyclicBarrier辨析

1countdownlatch放行由第三者控制CyclicBarrier放行由一组线程本身控制
2countdownlatch放行条件》=线程数CyclicBarrier放行条件=线程数

 

Semaphore

控制同时访问某个特定资源的线程数量,用在流量控制

 

Exchange

两个线程间的数据交换,

 

CallableFutureFutureTask 

isDone结束正常还是异常结束或者自己取消返回true

isCancelled 任务完成前被取消,返回true

cancelboolean):

1、 任务还没开始,返回false

2、 任务已经启动,canceltrue),中断正在运行的任务,中断成功,返回truecancelfalse),不会去中断已经运行的任务

3、 任务已经结束,返回false

 

包含图片和文字的文档的处理:图片(云上),可以用future去取图片,主线程继续解析文字。

并发编程(2)--线程的并发工具类

标签:end   pack   上下   import   inf   vat   rand   上下文   形式   

原文地址:https://www.cnblogs.com/zqLoveSym/p/12245103.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!