




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
问题的描述问题的描述 启动 3 个线程打印递增的数字 线程 1 先打印 1 2 3 4 5 然后是线程 2 打印 6 7 8 9 10 然后是线程 3 打印 11 12 13 14 15 接着再由线程 1 打印 16 17 18 19 20 以此类推 直到打印到 75 程序的输出结果应该为 线程 1 1 线程 1 2 线程 1 3 线程 1 4 线程 1 5 线程 2 6 线程 2 7 线程 2 8 线程 2 9 线程 2 10 线程 3 71 线程 3 72 线程 3 73 线程 3 74 线程 3 75 解法一解法一 采用原始的采用原始的 synchronized synchronized wait wait notify notify notifyAll notifyAll 等方式等方式 控制线程控制线程 Java 代码 1 public class NumberPrintDemo 2 n 为即将打印的数字 3 private static int n 1 4 state 1 表示将由线程 1 打印数字 state 2 表示将由线程 2 打 印数字 state 3 表示将由线程 3 打印数字 5 private static int state 1 6 7 public static void main String args 8 final NumberPrintDemo pn new NumberPrintDemo 9 new Thread new Runnable 10 public void run 11 3 个线程打印 75 个数字 单个线程每次打印 5 个 连续数字 因此每个线程只需执行 5 次打印任务 3 5 5 75 12 for int i 0 i 5 i 13 3 个线程都使用 pn 对象做锁 以保证每个交 替期间只有一个线程在打印 14 synchronized pn 15 如果 state 1 说明此时尚未轮到线程 1 打印 线程 1 将调用 pn 的 wait 方法 直到下次被唤醒 16 while state 1 17 try 18 pn wait 19 catch InterruptedException e 20 e printStackTrace 21 22 当 state 1 时 轮到线程 1 打印 5 次数字 23 for int j 0 j 5 j 24 打印一次后 n 自增 25 System out println Thread currentTh read getName 26 n 27 28 System out println 29 线程 1 打印完成后 将 state 赋值为 2 表示接下来将轮到线程 2 打印 30 state 2 31 notifyAll 方法唤醒在 pn 上 wait 的线 程 2 和线程 3 同时线程 1 将退出同步代码块 释放 pn 锁 32 因此 3 个线程将再次竞争 pn 锁 33 假如线程 1 或线程 3 竞争到资源 由于 state 不为 1 或 3 线程 1 或线程 3 将很快再次 wait 释放出刚到手的 pn 锁 34 只有线程 2 可以通过 state 判定 所以线 程 2 一定是执行下次打印任务的线程 35 对于线程 2 来说 获得锁的道路也许是曲 折的 但前途一定是光明的 36 pn notifyAll 37 38 39 40 线程 1 start 41 42 new Thread new Runnable 43 public void run 44 for int i 0 i 5 i 45 synchronized pn 46 while state 2 47 try 48 pn wait 49 catch InterruptedException e 50 e printStackTrace 51 52 for int j 0 j 5 j 53 System out println Thread currentTh read getName 54 n 55 56 System out println 57 state 3 58 pn notifyAll 59 60 61 62 线程 2 start 63 64 new Thread new Runnable 65 public void run 66 for int i 0 i 5 i 67 synchronized pn 68 while state 3 69 try 70 pn wait 71 catch InterruptedException e 72 e printStackTrace 73 74 for int j 0 j 5 j 75 System out println Thread currentTh read getName 76 n 77 78 System out println 79 state 1 80 pn notifyAll 81 82 83 84 线程 3 start 85 86 解法二解法二 采用采用 JDK1 5JDK1 5 并发包提供的并发包提供的 Lock Lock ConditionCondition 等类的相关方法控制线程等类的相关方法控制线程 Java 代码 1 public class NumberPrint implements Runnable 2 private int state 1 3 private int n 1 4 使用 lock 做锁 5 private ReentrantLock lock new ReentrantLock 6 获得 lock 锁的 3 个分支条件 7 private Condition c1 lock newCondition 8 private Condition c2 lock newCondition 9 private Condition c3 lock newCondition 10 11 Override 12 public void run 13 new Thread new Runnable 14 public void run 15 for int i 0 i 5 i 16 try 17 线程 1 获得 lock 锁后 其他线程将无法 进入需要 lock 锁的代码块 18 在 lock lock 和 lock unlock 之间的 代码相当于使用了 synchronized lock 19 lock lock 20 while state 1 21 try 22 线程 1 竞争到了 lock 但是发 现 state 不为 1 说明此时还未轮到线程 1 打印 23 因此线程 1 将在 c1 上 wait 24 与解法一不同的是 三个线程并 非在同一个对象上 wait 也不由同一个对象唤醒 25 c1 await 26 catch InterruptedException e 27 e printStackTrace 28 29 如果线程 1 竞争到了 lock 也通过了 state 判定 将执行打印任务 30 for int j 0 j 5 j 31 System out println Thread currentTh read getName 32 n 33 34 System out println 35 打印完成后将 state 赋值为 2 表示下一 次的打印任务将由线程 2 执行 36 state 2 37 唤醒在 c2 分支上 wait 的线程 2 38 c2 signal 39 finally 40 打印任务执行完成后需要确保锁被释放 因此将释放锁的代码放在 finally 中 41 lock unlock 42 43 44 45 线程 1 start 46 47 new Thread new Runnable 48 public void run 49 for int i 0 i 5 i 50 try 51 lock lock 52 while state 2 53 try 54 c2 await 55 catch InterruptedException e 56 e printStackTrace 57 58 for int j 0 j 5 j 59 System out println Thread currentTh read getName 60 n 61 62 System out println 63 state 3 64 c3 signal 65 finally 66 lock unlock 67 68 69 70 线程 2 start 71 72 new Thread new Runnable 73 public void run 74 for int i 0 i 5 i 75 try 76 77 lock lock 78 while state 3 79 try 80 c3 await 81 catch InterruptedException e 82 e printStackTrace 83 84 for int j 0 j 5 j 85 System out println Thread currentTh read getName 86 n 87 88 System out println 89 state 1 90 c1 signal 91 finally 92 lock unlock 93 94 95 96 线程 3 start 97 98 99 public static void main String args 100 new NumberPrint run 101 102 总结总结 对比解法一和解法二对比解法一和解法二 显然解法二是更好的解决方案显然解法二是更好的解决方案 解法一的问题在解法一的问题在 于无法进行精确唤醒于无法进行精确唤醒 比如线程比如线程 1 1 执行完打印任务并调用执行完打印任务并调用 pn notifyAll pn notifyAll 方法方法 后后 3 3 个线程将再次竞争锁个线程将再次竞争锁 而不是精确唤醒线程而不是精确唤醒线程 2 2 虽然线程虽然线程 2 2 最终将赢得锁最终将赢得锁 下一次的打印任务也肯定会由线程下一次的打印任务也肯定会由线程 2 2 执行执行 但是竞
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 供水管网清洗及维护周期管理方案
- 水痘的防治教学课件
- 水电材料基础知识培训课件
- 走进数字影视技术观看经典影片并写作影评04课件
- 2025版建筑工程劳务大清包合同(辅材供应与施工监督)
- 2025版海洋工程建设项目施工合同小型工程本协议
- 二零二五年度智能穿戴产品全球代理销售合同
- 二零二五年度城市综合体联合开发合同
- 2025版店面租赁与品牌形象维护合同
- 2025版企事业单位车辆租赁与资产管理合同
- 中药学专业大学生职业生涯规划与行业趋势
- 艾梅乙检测结果解读培训课件
- ESD静电管理评审计划+管理评审报告全套资料
- 04735数据库系统原理-串讲
- 绿色工厂培训课件
- 制造业的网络安全培训
- 接触网工程图识图 六跨电分相绝缘锚段关节安装图的识图
- 工业厂房监理规划范本
- 急性心肌梗死的护理PPT
- 花卉学 二年生花卉
- 管道工程隐蔽验收记录表
评论
0/150
提交评论