分支/合并框架
ForkJoinPool维护一个线程池,当调用ForkJoinPool对象的invoke()方法时,将任务分发给ForkJoinTask执行。
ForkJoinTask具体是执行任务的类,一般我们使用其子类,当需要返回值时,使用RecursiveTask;不需要返回值
则使用RecursiveAction,在执行子任务的时候,执行 compute方法,注意,在调用invoke方法完成的时候会形成阻塞
,调用者后面的代码会等待invoke执行完后再执行。
--------------
SplitNumCaculateSample>分步获取所有数组的和
/** * * * @author Lean @date:2014-10-7 */ public class SplitNumCaculateSample { public static int[] num={10,50,20,100,10}; public static final int THRESHOLD=5; public static void main(String[] args) { ForkJoinPool pool=new ForkJoinPool(Runtime.getRuntime().availableProcessors()); pool.invoke(new SortTask(num)); } static class SortTask extends RecursiveAction{ private static final long serialVersionUID = 1L; private int[] mCalculateNum; public SortTask(int[] calculateNum){ mCalculateNum=calculateNum; } @Override protected void compute() { if (mCalculateNum.length>2) { int[] lastArray=new int[mCalculateNum.length-2]; for (int i = 2; i < mCalculateNum.length; i++) { lastArray[i-2]=mCalculateNum[i]; } invokeAll(new SortTask(new int[]{mCalculateNum[0],mCalculateNum[1]}), new SortTask(lastArray)); merge(mCalculateNum); }else { merge(mCalculateNum); } } } private static void merge(int[] mCalculateNum){ int sum=0; for (int i : mCalculateNum) { sum+=i; } System.out.println("sum is:"+sum); } }
--------------
线程安全集合
List<E> syncArrayList=Collections.synchronizedList(new ArrayList());
Map<K,V>syncHashMap=Collections.synchronizedMap(new HashMap<K,V>());
5.0
ConcurrentHashMap,ConcurrentSkipListMap,
ConcurrentSkipSet,ConcurrentLinkedQueue;
7.0
ConcurrentLinkedDeque;ThreadLocalRandom
Thread.ThreadLocals>该类其实是一个包装类,由每条线程保存的一个副本,其包装了
map的键值对.总的来说ThreadLocals是Thread里面的一个对象,当我们创建一个ThreadLocal
对象的时候,把自己和存储值作为map放进Thread中,作为Thread.ThreadLocals对象的引用.
所有每个对象都有自己的ThreadLocals,每个ThreadLocals都存放着线程唯一的map.