JAVA进阶-多线程(4)

来源:互联网 发布:网络食品安全违法 编辑:程序博客网 时间:2024/05/17 18:01

分支/合并框架


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;}@Overrideprotected 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.
1 0
原创粉丝点击