腾讯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 J2EEJAVA目前在腾迅的应用 KJAVA程序的应用 KJAVAQQ等 JSP SERVLET的应用 SOCKETSERVER TCP UDP 的应用 为何选择JAVA 开发效率 程序稳定性 高效 成本因素 新版JDK的一些新特性 由于本次课程的各位同学都是有一定的JAVA开发经验的 本次不再准备从传统的JAVA语法开始罗嗦 而着眼于在短时间内介绍在平时开发工作中 非常重要的一些基础知识 与及新版JDK引入的一些新特性 方便大家在工作中使用 新版JDK的一些新特性 JDK1 4的新特性Nio大大地改进了JAVA的I O效率 并能够最大化地利用OS的底层特性 支持了内存映射 文件锁定等新特性 连JDK原先I O的底层 都用nio重写过 JDK1 5的新特性泛型Listalist newArrayList alist add newDate 编译时会报错 新版JDK的一些新特性 自动装拆箱以前 ArrayListlist newArrayList list add 0 newInteger 42 inttotal list get 0 intValue 以后 ArrayListlist newArrayList list add 0 42 inttotal list get 0 是不是觉得很爽呢 新版JDK的一些新特性 java util concurrent包的引用concurrent包为JAVA在并发编程方面带来了革命性的影响 简直可以用石破天惊来形容 带来了什么 更高效的锁定机制 可彻底替代synchronized关键字 高效的非加锁的线程安全的并发集合类 ConcurrentHashMap Con ConcurrentLinkedQueue 内置的高效的线程池 连通用的线程池都已在官方库中内置 上面这几项特性意味着什么 一个通用的并发程序的框架已经完全成型 JAVA的集合结构 数据结构是程序的灵魂 基本上每种编程语言的教程 首先讲的肯定是该门语言内置的数据结构 JDK里面已经内置了各种常用的集合结构 如链表 哈希表等 可以很方便地使用 这些数据结构都放在java util包里面 每一个JAVA的开发人员 都应该非常了解里面的结构 JDK的集合结构经过了两次比较大的改变 至今已经比较成熟 JDK1 0 包括了常用的几种集合结构 如可变数组 Vector 哈希表 HashTable 等 很可惜 这些集合结构里面的方法均是线程安全的 运行效率有问题 JDK1 2 彻底重写了原先的集合结构 增加了很多个类 如ArrayList LinkedList HashMap等 这些均不是线程安全的 至此 JAVA的集合结构已经成型 JDK1 5 增加了concurrent包 增加了很多非加锁的线程安全的结构 JAVA的集合结构变得更加完善 JAVA的集合结构 先看看集合结构里面的接口 JAVA的集合结构 先看看集合结构里面的类 JAVA的集合结构 Collection ListArrayListLinkedListSetHashSetTreeSetQueuePriorityQueue JAVA的集合结构 Map HashMapTreeMap 底层用红黑树实现的可排序的MapHashTable 基本上已经可以不用ConcurrentHashMap 线程安全的非锁定的MapIterator ListIterator concurrent包的特性及应用 concurrent包是JDK1 5引入的 便于编写并发程序的非常有用的包 其前身是纽约州立大学Oswego分校计算机系教授DougLea写的util concurrent包 该包主要引入了以下特性 更高效的锁定机制高效的非加锁的线程安全的并发集合类内置的高效的线程池 更高效的锁定机制 JDK1 5之前 线程的同步是采用synchronized关键字的 其典型的用法是 synchronized lockObject updateobjectstate 或 Synchronizedfunction 看起来比较完美地解决了线程同步的问题 为什么JDK1 5还会引入新的锁定机制呢 更高效的锁定机制 Synchronized的缺点 性能 以及功能上的一些限制 它无法中断一个正在等候获得锁的线程 也无法通过投票得到锁 如果不想等下去 也就没法得到锁 因此 JDK1 5引入了新的锁定机制 在java util concurrent lock包下面 该Lock框架是锁定的一个抽象 它允许把锁定的实现作为Java类 而不是作为语言的特性来实现 这就为Lock的多种实现留下了空间 各种实现可能有不同的调度算法 性能特性或者锁定语义 更高效的锁定机制 ReentrantLock类 Lock的一个实现 典型用法 Locklock newReentrantLock lock lock try updateobjectstate 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 用法如 Mapmap Collections synchronizedMap newHashMap 有所改进 但仍然有很多时候会锁住整个集合 执行效率仍是很差 高效的非加锁的并发集合类 ConcurrentHashMap对Map的线程安全的实现 比起synchronizedMap来 它提供了好得多的并发性 它使得读操作全部可以并发执行 而一定数量的写操作也可以同时并发执行 默认是16个 可以设置 另外 对于遍历所用的iterator 永远都不会再throw讨厌的ConcurrentModificationException 它大大地减少了锁定的概率 在有多线程的场合 无论在性能和方便性来讲 ConcurrentHashMap都将会比HashMap更加适合 ConcurrentHashMap的实现利用了JAVA内存模型 JMM 有兴趣的同学可以参考相关文档 高效的非加锁的并发集合类 ConcurrentHashMap和HashTable可伸缩性比较 高效的非加锁的并发集合类 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遍历整个队列 高效的非加锁的并发集合类 其它的一些并发集合的简单介绍 LinkedBlockingQueue内部用链表实现的阻塞队列ArrayBlockingQueue内部用数组实现的阻塞队列CopyOnWriteArrayList线程安全的ArrayList 对于add set等操作 用将原先的数组copy到新的来实现 避免了抛ConcurrentModificationException CopyOnWriteArraySet和CopyOnWriteArrayList类似 只是它是Set 内置的高效的线程池 对于一个并发程序来说 线程池可说是其中一个比较重要的部分 尤其是对我们公司经常写的各种SocketServer来讲 其流程一般都是 接收客户端请求 处理逻辑 将结果返回给客户端 处理逻辑那段 经常要用到多线程 或多进程 一般有以下两种实现 1 每次请求都生成一个新的线程 或进程 去处理 2 每次请求到来 从线程池 进程池 中取出一个 然后让其处理 在以前 线程池只能是自己重新发明车轮去写 或者从网上找第三方的线程池 质量很难得到保证 内置的高效的线程池 如果告诉大家在JDK中已经有了线程池 大家是否会觉得激动 没错 JDK1 5的确已经内置了高效的通用的线程池 真XX爽 一段示范代码 ThreadPoolExecutorthreadPool newThreadPoolExecutor 10 1000 30 TimeUnit SECONDS newArrayBlockingQueue 3 newThreadPoolExecutor DiscardOldestPolicy while 接收请求 threadPool execute newWorkerThread XXX 上面这段代码首先生成一个初始化为10个 最大为1000个线程的线程池 每次接收请求的时候 都从线程程中抽出一个线程来运行 内置的高效的线程池 Runnable Callable和FutureRunnable这个接口我们已经非常熟悉 它代表线程的执行 里面有一个run方法 但是它是没办法返回线程的执行结果的 当然 通过间接的方法可以 JDK1 5新增了一个Callable接口 和Runnable类似 只是里面的call方法是可以返回线程的执行结果的 Future这个接口则是描述异步运算的结果 里面的方法 cancel booleanmayInterruptIfRunning 取消该次执行get 等待并获取运算结果get longtimeout TimeUnitunit 等待一定时间获取运算结果isCancelled 判断任务是否已经取消isDone 判断任务是否已经完成这三个接口构成了线程池的基础 内置的高效的线程池 一个具体的例子 classMatchCounterimplementsCallable publicMatchCounter Filedirectory Stringkeyword publicIntegercall returnsthenumberofmatchingfiles FutureTasktask newFutureTask counter Threadt newThread task t start System out println task get matchingfiles 内置的高效的线程池 线程池的一个实现 ThreadPoolExecutor 它实现了线程池的各方面的功能 如 执行某个任务 返回或不返回结果 初始化一定数量的线程 随着负荷的增大而新建线程 并控制线程池的最大容量 在线程执行之前和之后执行一段代码 删除某个任务 关闭整个线程池 获取线程池运行的各个运行期参数 非常齐备 从此不再需要每次都重新发明车轮 内置的高效的线程池 ThreadPoolExecutor的一些常用方法 ThreadPoolExecutor intcorePoolSize intmaximumPoolSize longkeepAliveTime TimeUnitunit BlockingQueueworkQueue RejectedExecutionHandlerhandler 这是其中一个构造函数 第一个参数是常驻的线程数 第二个参数为线程池的最大容量 第三个为清除空闲线程的最长时间 第四个为时间的单位 第五个为线程池内部队列 第六个为清除空闲线程的策略 有点晕 但的确个个参数都比较有用 内置的高效的线程池 ThreadPoolExecutor的一些常用方法 voidexecute Runnablecommand 运行某个任务 不返回结果 Futuresubmit Callabletask 将某个任务放进线程池 并获取其运行结果intgetActiveCount 获取线程池中活跃线程的数量longgetCompletedTaskCount 获取已执行完的任务的数量shutdown和shutdownNow 关闭线程池 类似于kill和kill 9 concurrent包的特性及应用 JDK1 5引入的concurrent包 为用JAVA编写并发程序提供了更多的便利和性能 可以毫不夸张地说 用了这个包 编写高性能的各种server 已经不再是一个特别困难和神秘的事情了 这个包的特性还有很多 具体各位同学可以阅读jdk的manual和查找相关资料作进一步的学习 JMX的介绍及应用 JMX JavaManagementExtensions

温馨提示

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

评论

0/150

提交评论