java并发编程-一道经典多线程题的2种解法

上传人:桔**** 文档编号:494740623 上传时间:2024-02-03 格式:DOCX 页数:9 大小:21.76KB
返回 下载 相关 举报
java并发编程-一道经典多线程题的2种解法_第1页
第1页 / 共9页
java并发编程-一道经典多线程题的2种解法_第2页
第2页 / 共9页
java并发编程-一道经典多线程题的2种解法_第3页
第3页 / 共9页
java并发编程-一道经典多线程题的2种解法_第4页
第4页 / 共9页
java并发编程-一道经典多线程题的2种解法_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《java并发编程-一道经典多线程题的2种解法》由会员分享,可在线阅读,更多相关《java并发编程-一道经典多线程题的2种解法(9页珍藏版)》请在金锄头文库上搜索。

1、问题的描述启动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, wait(), notify(), notifyAll()等方式控制线程.Java代码 1.

2、publicclassNumberPrintDemo 2. /n为即将打印的数字 3. privatestaticintn=1; 4. /state=1表示将由线程1打印数字,state=2表示将由线程2打印数字,state=3表示将由线程3打印数字 5. privatestaticintstate=1; 6. 7. publicstaticvoidmain(Stringargs) 8. finalNumberPrintDemopn=newNumberPrintDemo(); 9. newThread(newRunnable() 10. publicvoidrun() 11. /3个线程打印7

3、5个数字,单个线程每次打印5个连续数字,因此每个线程只需执行5次打印任务.3*5*5=75 12. for(inti=0;i5;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(InterruptedExceptione) 20. e.printStackTrace(); 21. 22. /当state=

4、1时,轮到线程1打印5次数字 23. for(intj=0;j5;j+) 24. /打印一次后n自增 25. System.out.println(Thread.currentThread().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竞争到资源,由

5、于state不为1或3,线程1或线程3将很快再次wait,释放出刚到手的pn锁. 34. /只有线程2可以通过state判定,所以线程2一定是执行下次打印任务的线程. 35. /对于线程2来说,获得锁的道路也许是曲折的,但前途一定是光明的. 36. pn.notifyAll(); 37. 38. 39. 40. ,线程1).start(); 41. 42. newThread(newRunnable() 43. publicvoidrun() 44. for(inti=0;i5;i+) 45. synchronized(pn) 46. while(state!=2) 47. try 48. p

6、n.wait(); 49. catch(InterruptedExceptione) 50. e.printStackTrace(); 51. 52. for(intj=0;j5;j+) 53. System.out.println(Thread.currentThread().getName() 54. +:+n+); 55. 56. System.out.println(); 57. state=3; 58. pn.notifyAll(); 59. 60. 61. 62. ,线程2).start(); 63. 64. newThread(newRunnable() 65. publicvo

7、idrun() 66. for(inti=0;i5;i+) 67. synchronized(pn) 68. while(state!=3) 69. try 70. pn.wait(); 71. catch(InterruptedExceptione) 72. e.printStackTrace(); 73. 74. for(intj=0;j5;j+) 75. System.out.println(Thread.currentThread().getName() 76. +:+n+); 77. 78. System.out.println(); 79. state=1; 80. pn.noti

8、fyAll(); 81. 82. 83. 84. ,线程3).start(); 85. 86. public class NumberPrintDemo / n为即将打印的数字private static int n = 1;/ state=1表示将由线程1打印数字, state=2表示将由线程2打印数字, state=3表示将由线程3打印数字private static int state = 1;public static void main(String args) final NumberPrintDemo pn = new NumberPrintDemo();new Thread(new Runnable() public void run() / 3个线程打印75个数字, 单个线程每次打印5个连续数字, 因此每个线程只需执行5次打印任务. 3*5*5=75for (int i = 0; i 5; i+) / 3个线程都使用pn对象做锁, 以保证每个交替期间只有一个线程在打印

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

当前位置:首页 > 高等教育 > 习题/试题

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