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.

时间: 2024-10-08 00:57:56

JAVA进阶-多线程(4)的相关文章

JAVA进阶-多线程(3)

1.以前使用线程API并没有返回结果,Callable/Future/FutureTask正是解决了此问题,并在调用过程中 作出对异常的捕获 -Callable执行call()方法返回Object对象,也可抛出异常;调用 Callable并不像Thread,而是调用<T> Future ExecutorService.submit(Callable<T> task); -Future 返回值,调用该接口的get()方法,可返回对应的对象 ------------------ Sal

JAVA进阶-多线程(2)

堵塞队列: 1)BlockingQueue该接口提供了: add()/remove() 假设当队列没有数据,从队列中取数据;或者队列中数据已满, 向队列中加入数据;则会抛出异常. put()/take() 假设当队列没有数据,从队列中取数据;或者队列中数据已满, 向队列中加入数据;则会形成堵塞. offer()/poll() 会给调用者返回特殊的值,开发人员能够通过这些值做对应的处理 同一时候还提供了超时版本号. 2)接口实现 ArrayBlockingQueue>由数组实现的有界队列,默认情况

Java进阶(三)多线程开发关键技术

原创文章,转载请务必将下面这段话置于文章开头处. 本文转发自Jason's Blog,原文链接 http://www.jasongj.com/java/multi_thread/ sleep和wait到底什么区别 其实这个问题应该这么问--sleep和wait有什么相同点.因为这两个方法除了都能让当前线程暂停执行完,几乎没有其它相同点. wait方法是Object类的方法,这意味着所有的Java类都可以调用该方法.sleep方法是Thread类的静态方法. wait是在当前线程持有wait对象锁

Java进阶书籍推荐

学习Java,书籍是必不可少的学习工具之一,尤其是对于自学者而言.废话不多说,下边就给广大程序猿们推荐一些Java进阶的好书. 第一部分:Java语言篇 1.<Java编程规范> 适合对象:初级.中级 介绍:这本书的作者是被誉为Java之父的James Gosling,入门者推荐阅读,对基础的讲解很不错. 2.<Java编程思想> 适合对象:初级.中级 介绍:豆瓣给出了9.1的评分,全球程序员广泛赞誉.有人说这本书不适合初学者,不过小编认为作者并没有对读者已有的知识经验有过多要求,

Java进阶之路

Java进阶之路--从初级程序员到架构师,从小工到专家. 怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作三五年之后开始迷茫的老程序员经常会问到的问题.希望这篇文章会是你看到过的最全面最权威的回答. 一: 编程基础 不管是C还是C++,不管是Java还是PHP,想成为一名合格的程序员,基本的数据结构和算法基础还是要有的.下面几篇文章从思想到实现,为你梳理出常用的数据结构和经典算法. 1-1 常

Java进阶(三十二) HttpClient使用详解

Java进阶(三十二) HttpClient使用详解 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性.因此熟练掌握HttpClient是很重要的必修内容,掌握HttpClient后,相信对于Http协议的了解会更加深入. 一.简介 HttpClient是A

Java进阶(三十四)Integer与int的种种比较你知道多少?

Java进阶(三十四)Integer与int的种种比较你知道多少? 前言 如果面试官问Integer与int的区别:估计大多数人只会说到两点:Ingeter是int的包装类,注意是一个类:int的初值为0,Ingeter的初值为null.但是如果面试官再问一下Integer i = 1;int ii = 1; i==ii为true还是为false?估计就有一部分人答不出来了,如果再问一下其他的,估计更多的人会头脑一片混乱.所以我对它们进行了总结,希望对大家有帮助. 首先看代码: package

Java 进阶(一) JVM运行时内存模型

1.JVM运行时数据区域的划分 a.程序计数器(Program Counter Register) 一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器.每个线程拥有独立的一个计数器,如果当前执行的是Native方法,则计数器值为空. b.JVM栈(Java Virtual Machine Stack) 描述Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stacks Frame)用于存储局部变量表,操作数栈,动态链接,方法出口等信息. 每一个方法从调用直至执行完成

java进阶08 GUI图形界面

图形化用户界面(GUI) 简而言之,就是可视化编程. 要想实现可视化界面(窗口),需要用到JFrame类. package Frame; public class JFrame1 { public static void main(String[] args){ UI ui=new UI(); } } 先建一个主函数,而主函数中的操作只有一句代码.这样做,既能直观又方便后期修改. 接下来是UI类的实现 package Frame; import javax.swing.JFrame; publi