Java多线程与并发库高级应用

上传人:ji****72 文档编号:37533001 上传时间:2018-04-18 格式:DOC 页数:42 大小:695KB
返回 下载 相关 举报
Java多线程与并发库高级应用_第1页
第1页 / 共42页
Java多线程与并发库高级应用_第2页
第2页 / 共42页
Java多线程与并发库高级应用_第3页
第3页 / 共42页
Java多线程与并发库高级应用_第4页
第4页 / 共42页
Java多线程与并发库高级应用_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《Java多线程与并发库高级应用》由会员分享,可在线阅读,更多相关《Java多线程与并发库高级应用(42页珍藏版)》请在金锄头文库上搜索。

1、张孝祥_Java 多线程与并发库高级应用 【视频介绍:】Java 线程是一项非常基本和重要的技术,在偏底层和偏技术的 Java 程序中不可避免地 要使用到 Java 线程技术,特别是 android 手机程序和游戏开发中,多线程成了必不可少的 一项重要技术。但是,很多 Java 程序员对 Java 线程技术的了解都仅停留在初级阶段,在 项目中一旦涉及到多线程时往往就表现得糟糕至极,所以,软件公司常常使用 Java 线程技 术来考察面试者的基本功和判断其编码水平的高低。本套视频教程是专门为了帮助那些已经学习和了解过、但掌握得并不是很深入的人们 提高 java 线程技术而讲解的,所以,Java 线

2、程初学者学习本视频教程时可能会比较吃力, 可能必须耐心学习多遍才能渐入佳境,但是,你一旦掌握了其中的内容,你对 Java 线程技 术的了解将会相当出众! 【视频目录列表:】01. 传统线程技术回顾02. 传统定时器技术回顾03. 传统线程互斥技术04. 传统线程同步通信技术05. 线程范围内共享变量的概念与作用06. ThreadLocal 类及应用技巧07. 多个线程之间共享数据的方式探讨08. java5 原子性操作类的应用09. java5 线程并发库的应用10. Callable 与 Future 的应用11. java5 的线程锁技术12. java5 读写锁技术的妙用13. jav

3、a5 条件阻塞 Condition 的应用14. java5 的 Semaphere 同步工具15. java5 的 CyclicBarrier 同步工具16. java5 的 CountDownLatch 同步工具17. java5 的 Exchanger 同步工具18. java5 阻塞队列的应用19. java5 同步集合类的应用20. 空中网挑选实习生的面试题 1 21. 空中网挑选实习生的面试题 2 22. 空中网挑选实习生的面试题 3 23. 源代码与资料01. 传统线程技术回顾传统线程技术回顾 传统是相对于 JDK1.5 而言的 传统线程技术与 JDK1.5 的线程并发库 线程就

4、是程序的一条执行线索/线路。 创建线程的两种传统方式 1.创建 Thread 的子类,覆盖其中的 run 方法,运行这个子类的 start 方法即可开启线程 Thread thread = new Thread() Override public void run() while (true) 获取当前线程对象获取线程名字 Thread.currentThread()threadObj.getName() 让线程暂停,休眠,此方法会抛出中断异常 InterruptedException Thread.sleep(毫秒值); ; thread.start(); 2.创建 Thread 时传递一个

5、实现 Runnable 接口的对象实例 Thread thread = new Thread(new Runnable() public void run() ); thread.start();问题:下边的线程运行的是 Thread 子类中的方法还是实现 Runnable 接口类的方法 new Thread( b、传递实现 Runnable 接口的对象 new Runnable() public void run() ) a、覆盖 Thread 子类 run 方法 public void run() .start(); 分析:new Thread(Runnable.run()run().st

6、art(); 子类 run 方法实际就是覆盖父类中的 run 方法,如果覆盖了就用子类的 run 方法,不会 再找 Runnable 中的 run 方法了,所以运行的是子类中的 run 方法总结: 由 Thread 类中的 run 方法源代码中看出,两种传统创建线程的方式都是在调用 Thread 对象的 run 方法,如果 Thread 对象的 run 方法没有被覆盖,并且像上边的问题那样为 Thread 对象传递了一个 Runnable 对象,就会调用 Runnable 对象的 run 方法。 多线程并不一定会提高程序的运行效率。举例:一个人同时在三张桌子做馒头 多线程下载:并不是自己电脑快

7、了,而是抢到更多服务器资源。例:服务器为一个客 户分配一个 20K 的线程下载,你用多个线程,服务器以为是多个用户就分配了多个 20K 的 资源给你。02. 传统定时器技术回顾传统定时器技术回顾 传统定时器的创建:直接使用定时器类 Timer a、过多长时间后炸 new Timer().schedule(TimerTask 定时任务, Date time 定的时间); b、过多长时间后炸,以后每隔多少时间再炸 new Timer().schedule(TimerTask 定时任务, Long 延迟(第一次执行)时间, Long 间隔时间); TimerTask 与 Runnable 类似,有一

8、个 run 方法 Timer 是定时器对象,到时间后会触发炸弹(TimerTask)对象 示例:new Timer().schedule( new TimerTask()定时执行的任务 public void run() SOP(“bombing”); 显示计时信息 while (true) SOP(new Date().getSeconds(); Thread.sleep(1000); , 10定好的延迟时间,10 秒以后执行任务 ); 问题:2 秒后炸,爆炸后每隔 3 秒再炸一次 定时器 2 秒后炸,炸弹里还有定时器(每 3 秒炸一次) class MyTimerTask extends

9、TimerTask这就是准备用的子母弹 public void run() 本身就是一颗炸弹 SOP(bombing); 内部子弹 new Timer().schedule( new MyTimerTask(), 2000 ); 放置子母弹,2 秒后引爆 new Timer().schedule(new MyTimerTask(), 2000); 问题延伸: 上面的问题延伸,母弹炸过后,子弹每隔 3 秒炸一次,再每隔 8 秒炸一次 1、在 MyTimerTask 内部定义一个静态变量记录炸弹号,在 run 方法内将炸弹号加 1, 每次产生新炸弹,号码就会加 1,根据炸弹号判断是 3 秒炸还是

10、8 秒炸。 注意:内部类中不能声明静态变量 定义一个静态变量 private static count = 0; 在 run 方法内部:count=(count+1)%2; 将定时器的时间设置为:2000+2000*count 2、用两个炸弹来完成,A 炸弹炸完后启动定时器安装 B 炸弹,B 炸弹炸完后也启动 一个定时器安装 A 炸弹。定时器还可以设置具体时间,如某年某月某日某时可以设置周一到周五做某事,自己设置的话需要换算日期时间,可以使用开源工具 quartz 来完成。03. 传统线程互斥技术传统线程互斥技术 线程安全问题例子:银行转账 同一个账户一边进行出账操作(自己交学费) ,另一边进

11、行入账操作(别人给自己付款) ,线程不同步带来的安全问题 示例:逐个字符的方式打印字符串 class Outputer public void output(String name) int len = name.length(); for (int i=0; i threadData = new HashMap(); public static void main(String args) 创建两个线程 for (int i=0; i threadLocal = newnew ThreadLocal(); 07. 多个线程之间共享数据的方式探讨多个线程之间共享数据的方式探讨 例子:卖票:多个

12、窗口同时卖这 100 张票,票就需要多个线程共享 a、如果每个线程执行的代码相同,可以使用同一个 Runnable 对象,这个对象中有共享数 据。 卖票就可以这样做,每个窗口都在做卖票任务,卖的票都是同一个数据。 b、如果每个线程执行的代码不同,就需要使用不同的 Runnable 对象,有两种方式实现 Runnable 对象之间的数据共享: a)将共享数据单独封装到一个对象中,同时在对象中提供操作这些共享数据的方法, 可以方便实现对共享数据各项操作的互斥和通信。 b)将各个 Runnable 对象作为某个类的内部类,共享数据作为外部类的成员变量,对 共享数据的操作方法也在外部类中提供,以便实现

13、互斥和通信,内部类的 Runnable 对象调 用外部类中操作共享数据的方法即可。 注意:要同步互斥的几段代码最好分别放在几个独立的方法中,这些方法再放在同一 个类中,这样比较容易实现它们之间的同步互斥和通信。08. java5 原子性操作类的应用原子性操作类的应用 Java5 的线程并发库 java.util.concurrent 在并发编程中很常用的实用工具类。 |-locks 为锁和等待条件提供一个框架的接口和类, 它不同于内置同步和监视器 |-atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 可以对基本类型、数组中的基本类型、类中的基本类型等进行操作 |-Atomic

14、Integer构造方法摘要构造方法摘要AtomicIntegerAtomicInteger() 创建具有初始值 0 的新 AtomicInteger。AtomicIntegerAtomicInteger(int initialValue) 创建具有给定初始值的新 AtomicInteger。方法摘要方法摘要intaddAndGetaddAndGet(int delta) 以原子方式将给定值与当前值相加。booleancompareAndSetcompareAndSet(int expect, int update) 如果当前值 = 预期值,则以原子方式将该值设置为给定的更新值。intdecre

15、mentAndGetdecrementAndGet() 以原子方式将当前值减 1。doubledoubleValuedoubleValue() 以 double 形式返回指定的数值。floatfloatValuefloatValue() 以 float 形式返回指定的数值。intgetget() 获取当前值。intgetAndAddgetAndAdd(int delta) 以原子方式将给定值与当前值相加。intgetAndDecrementgetAndDecrement() 以原子方式将当前值减 1。intgetAndIncrementgetAndIncrement() 以原子方式将当前值加 1。intgetAndSetgetAndSet(int newValue) 以原子方式设置为给定值,并返回旧值。intincrementAndGetincrementAndGet() 以原子方式将当前值加 1。intintValueintValue() 以 int 形式返回指定的数值。voidlazySetlazySet(int newValue) 最后设置为给定值。longlongValuelongValue() 以 long 形式返回指定的数值。voidsetset(int newValue) 设置为给定值

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号