`
阿尔萨斯
  • 浏览: 4184854 次
社区版块
存档分类
最新评论

JAVA进阶-多线程(4)

 
阅读更多

分支/合并框架


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.
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics