腾讯JAVA编程语言培训.ppt_第1页
腾讯JAVA编程语言培训.ppt_第2页
腾讯JAVA编程语言培训.ppt_第3页
腾讯JAVA编程语言培训.ppt_第4页
腾讯JAVA编程语言培训.ppt_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JAVA编程语言 无线产品部 许冠严 MQQ Kevinxu 内容大纲 JAVA 的特点及应用领域 新版JDK的一些新特性 JAVA的集合结构 Concurrent包的特性及应用 JMX的介绍及使用 JAVA常用参考资料 JAVA 的特点和应用领域 JAVA的特点 JAVA的应用领域 为何选择JAVA JAVA的特点 Java是一种跨平台,适合于分布式计算环境的 面向对象编程语言。SUN的白皮书中提到JAVA 有以下特点: 简单性、面向对象、分布式、解释型、可靠、 安全、平台无关、可移植、高性能、多线程、 动态性 JAVA的应用领域 大的分类:J2ME,J2SE,J2EE JAVA目前在腾迅的应用: KJAVA程序的应用。(KJAVAQQ等) JSP/SERVLET的应用。 SOCKET SERVER(TCP/UDP)的应用。 为何选择JAVA 开发效率。 程序稳定性。 高效。 成本因素。 新版JDK的一些新特性 由于本次课程的各位同学都是有一定的 JAVA开发经验的,本次不再准备从传统的JAVA 语法开始罗嗦。而着眼于在短时间内介绍在平 时开发工作中,非常重要的一些基础知识,与 及新版JDK引入的一些新特性,方便大家在工 作中使用。 新版JDK的一些新特性 JDK1.4的新特性 Nio 大大地改进了JAVA的I/O效率,并能够最大化地利用OS的 底层特性,支持了内存映射,文件锁定等新特性。 连JDK原先I/O的底层,都用nio重写过。 JDK1.5的新特性 泛型 List alist = new ArrayList(); alist.add(new Date(); 编译时会报错. 新版JDK的一些新特性 自动装拆箱 以前: ArrayList list = new ArrayList (); list.add(0, new Integer(42); int total = (list.get(0).intValue(); 以后: ArrayList list = new ArrayList(); list.add(0, 42); int total = list.get(0); 是不是觉得很爽呢?。 新版JDK的一些新特性 java.util.concurrent包的引用 concurrent包为JAVA在并发编程方面带来了革命性的影 响,简直可以用石破天惊来形容。 带来了什么? v 更高效的锁定机制。 (可彻底替代synchronized关键字 ) v 高效的非加锁的线程安全的并发集合类。( ConcurrentHashMap,Con, ConcurrentLinkedQueue) v 内置的高效的线程池。(连通用的线程池都已在官方库 中内置) 上面这几项特性意味着什么? 一个通用的并发程序的框架已经完全成型! JAVA的集合结构 数据结构是程序的灵魂,基本上每种编程语言的教程,首 先讲的肯定是该门语言内置的数据结构。 JDK里面已经内置了各种常用的集合结构,如链表,哈希 表等,可以很方便地使用,这些数据结构都放在java.util包里面。 每一个JAVA的开发人员,都应该非常了解里面的结构。 JDK的集合结构经过了两次比较大的改变,至今已经比较 成熟。 JDK1.0:包括了常用的几种集合结构,如可变数组(Vector), 哈希表(HashTable)等。很可惜,这些集合结构里面的方法均是线 程安全的,运行效率有问题。 JDK1.2:彻底重写了原先的集合结构,增加了很多个类。如 ArrayList,LinkedList,HashMap等。这些均不是线程安全的。 至此,JAVA的集合结构已经成型。 JDK1.5:增加了concurrent包,增加了很多非加锁的线程安全的 结构。JAVA的集合结构变得更加完善。 JAVA的集合结构 先看看集合结构里面的接口: JAVA的集合结构 先看看集合结构里面的类: JAVA的集合结构 Collection: List ArrayList LinkedList Set HashSet TreeSet Queue PriorityQueue JAVA的集合结构 Map: HashMap TreeMap:底层用红黑树实现的可排序的Map HashTable:基本上已经可以不用 ConcurrentHashMap:线程安全的非锁定的Map Iterator,ListIterator concurrent包的特性及应用 concurrent包是JDK1.5引入的,便于编写并发程 序的非常有用的包。其前身是纽约州立大学Oswego分 校计算机系教授Doug Lea写的util.concurrent包。 该包主要引入了以下特性: v 更高效的锁定机制 v 高效的非加锁的线程安全的并发集合类 v 内置的高效的线程池 更高效的锁定机制 JDK1.5之前,线程的同步是采用synchronized关 键字的,其典型的用法是: synchronized (lockObject) / update object state 或: Synchronized function() 看起来比较完美地解决了线程同步的问题,为什么JDK1.5还会引 入新的锁定机制呢? 更高效的锁定机制 Synchronized的缺点:性能,以及功能上的一些 限制:它无法中断一个正在等候获得锁的线程,也无 法通过投票得到锁,如果不想等下去,也就没法得到 锁。 因此,JDK1.5引入了新的锁定机制,在 java.util.concurrent.lock包下面。该Lock 框架是 锁定的一个抽象,它允许把锁定的实现作为 Java 类 ,而不是作为语言的特性来实现。这就为 Lock 的多 种实现留下了空间,各种实现可能有不同的调度算法 、性能特性或者锁定语义。 更高效的锁定机制 ReentrantLock类:Lock的一个实现。典型用法: Lock lock = new ReentrantLock(); lock.lock(); try / update object state finally lock.unlock(); 注意!一定要在finally块中释放锁! 更高效的锁定机制 性能比较: synchronized 和 Lock 的吞吐率,单 CPU 更高效的锁定机制 性能比较: Synchronized 和 Lock 的吞吐率,多CPU 更高效的锁定机制 除了性能方面的改进之外,JDK1.5的lock还带来 了以下特性:时间锁等候、可中断锁等候、无块结构 锁、多个条件变量或者锁投票。具体请参阅JDK的 manual。 如果对性能要求比较苛刻,或者需要上述的一些新 特性,就请大胆地忘记synchronized,用新的锁定机 制吧。不过记住JDK的版本要是1.5哦。_ 高效的非加锁的并发集合类 一直以来,对于集合来讲,线程安全和效 率好像就是两个不能并存的东西。要线程安全 ,必须要锁定集合,自然效率就有所下降。要 高效率,自然不能锁定,于是又不能做到线程 安全。 鱼与熊掌好像真的是不能兼得? 能否做到鱼与熊掌兼得呢? 事实上在JDK1.5引入了新的高效的非加锁 的线程安全的并发集合之后,鱼与熊掌真的是 可以兼得。 高效的非加锁的并发集合类 回忆一下,在以前,在实现一个线程安全的集合 ,可以有哪些方法呢? 1、用本身就是线程安全的集合,如HashTable, Vector。这样是线程安全了,里面每个方法都是,可 惜性能就非常差了。 2、用不是线程安全的集合,再包装一下,如 synchronizedMap 和 synchronizedList。用法如: Map map = Collections.synchronizedMap(new HashMap(); 有所改进,但仍然有很多时候会锁住整个集合,执行效 率仍是很差。 高效的非加锁的并发集合类 v ConcurrentHashMap 对Map的线程安全的实现,比起 synchronizedMap 来,它提供了好得多的并发性。它使得读操作全部可 以并发执行,而一定数量的写操作也可以同时并发执 行。(默认是16个,可以设置)。另外,对于遍历所 用的iterator,永远都不会再throw讨厌的 ConcurrentModificationException。它大大地减少 了锁定的概率。在有多线程的场合,无论在性能和方 便性来讲,ConcurrentHashMap都将会比HashMap 更加适合。 ConcurrentHashMap的实现利用了JAVA内存模型( JMM),有兴趣的同学可以参考相关文档。 高效的非加锁的并发集合类 ConcurrentHashMap和HashTable可伸缩性比较: 线程数 ConcurrentHashMa p Hashtable 11.001.03 22.5932.04 45.5878.23 813.21163.48 1627.58341.21 3257.27778.41 高效的非加锁的并发集合类 ConcurrentHashMap的一些常用方法: 1、put和putIfAbsent: 往该map中添加元素,返回添加的元素。区别是 putIfAbsent对于原先已存在的元素,则直接返回,不 存在才put进去 2、get 根据key读出某个元素 3、remove 根据key,或key-value对从map中删除元素 4、contains和containsKey 检索相关元素是否存在。注意!第一个是根据value 来查,第二个才是根据key来看的。 高效的非加锁的并发集合类 ConcurrentLinkedQueue: 线程安全的非阻塞队列,常用的一些方法: 1、add和offer 完全同义,在队列的尾部插入一个元素。 2、peek和poll 都是在队列的头部取出第一个元素。不同的是peek取 出后并没有将其删除,而poll则将该头元素删除出队 列 3、remove 在队列中将某个元素删除 4、iterator 遍历整个队列 高效的非加锁的并发集合类 ConcurrentLinkedQueue: 线程安全的非阻塞队列,常用的一些方法: 1、add和offer 完全同义,在队列的尾部插入一个元素。 2、peek和poll 都是在队列的头部取出第一个元素。不同的是peek取 出后并没有将其删除,而poll则将该头元素删除出队 列 3、remove 在队列中将某个元素删除 4、iterator 遍历整个队列 高效的非加锁的并发集合类 其它的一些并发集合的简单介绍: v LinkedBlockingQueue 内部用链表实现的阻塞队列 v ArrayBlockingQueue 内部用数组实现的阻塞队列 v CopyOnWriteArrayList 线程安全的ArrayList,对于add, set等操作,用将原 先的数组copy到新的来实现。避免了抛 ConcurrentModificationException。 v CopyOnWriteArraySet 和CopyOnWriteArrayList类似,只是它是Set 内置的高效的线程池 对于一个并发程序来说,线程池可说是其中一个 比较重要的部分。尤其是对我们公司经常写的各种 Socket Server来讲,其流程一般都是:接收客户端 请求处理逻辑将结果返回给客户端。处理逻辑那 段,经常要用到多线程(或多进程)。一般有以下两 种实现: 1、每次请求都生成一个新的线程(或进程)去处理。 2、每次请求到来,从线程池(进程池)中取出一个,然 后让其处理。 在以前,线程池只能是自己重新发明车轮去写, 或者从网上找第三方的线程池(质量很难得到保证) 内置的高效的线程池 如果告诉大家在JDK中已经有了线程池,大家是否会觉得激 动。没错,JDK1.5的确已经内置了高效的通用的线程池(真XX 爽)。 一段示范代码: ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 1000, 30, TimeUnit.SECONDS, new ArrayBlockingQueue(3), new ThreadPoolExecutor.DiscardOldestPolicy(); while(接收请求) threadPool.execute(new WorkerThread(XXX); 上面这段代码首先生成一个初始化为10个,最大为1000个线程的线 程池,每次接收请求的时候,都从线程程中抽出一个线程来运行 内置的高效的线程池 Runnable,Callable和Future Runnable这个接口我们已经非常熟悉,它代表线程的执行, 里面有一个run方法。但是它是没办法返回线程的执行结果的( 当然,通过间接的方法可以)。JDK1.5新增了一个Callable接口 ,和Runnable类似,只是里面的call方法是可以返回线程的执行 结果的。 Future这个接口则是描述异步运算的结果,里面的方法: cancel(boolean mayInterruptIfRunning): 取消该次执行 get():等待并获取运算结果 get(long timeout, TimeUnit unit):等待一定时间获取运算结果 isCancelled():判断任务是否已经取消 isDone():判断任务是否已经完成 这三个接口构成了线程池的基础。 内置的高效的线程池 一个具体的例子: class MatchCounter implements Callable public MatchCounter(File directory, String keyword) . . . public Integer call() . . . / returns the number of matching files FutureTask task = new FutureTask(counter); Thread t = new Thread(task); t.start(); System.out.println(task.get() + “ matching files.“); 内置的高效的线程池 线程池的一个实现:ThreadPoolExecutor,它实现 了线程池的各方面的功能,如: v 执行某个任务(返回或不返回结果)。 v 初始化一定数量的线程,随着负荷的增大而新建线程 ,并控制线程池的最大容量。 v 在线程执行之前和之后执行一段代码。 v 删除某个任务。 v 关闭整个线程池。 v 获取线程池运行的各个运行期参数 ,非常齐备,从此不再需要每次都重新发明车轮。 内置的高效的线程池 ThreadPoolExecutor的一些常用方法: v ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, RejectedExecutionHandler handler) 这是其中一个构造函数,第一个参数是常驻的线程数 ,第二个参数为线程池的最大容量,第三个为清除空 闲线程的最长时间,第四个为时间的单位。第五个为 线程池内部队列,第六个为清除空闲线程的策略(有 点晕,但的确个个参数都比较有用) 内置的高效的线程池 ThreadPoolExecutor的一些常用方法: v void execute(Runnable command) 运行某个任务(不返回结果) v Future submit(Callable task) 将某个任务放进线程池,并获取其运行结果 v int getActiveCount() 获取线程池中活跃线程的数量 v long getCompletedTaskCount() 获取已执行完的任务的数量 v shutdown和shutdownNow() 关闭线程池。类似于kill和kill 9。_ concurrent包的特性及应用 JDK1.5引入的concurrent包,为用JAVA编 写并发程序提供了更多的便利和性能。可以毫 不夸张地说,用了这个包,编写高性能的各种 server,已经不再是一个特别困难和神秘的事 情了。 这个包的特性还有很多,具体各位同学可 以阅读jdk的manual和查找相关资料作进一步 的学习。 JMX的介绍及应用 JMX-Java Management Extensions,即 Java管理扩展,是一个为应用程序、设备、系 统等植入管理功能的框架。JMX可以跨越一系 列异构操作系统平台、系统体系结构和网络传 输协议,灵活的开发无缝集成的系统、网络和 服务管理应用。 JMX的介绍及应用 JM

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论