- 2
- 0
- 约1.19万字
- 约 7页
- 2017-04-12 发布于四川
- 举报
java并发编程—一道经典多线程题的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, wait(), notify(), notifyAll()等方式控制线程.?Java代码 ?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=75 ??????????????????for?(int?i?=?0;?i??5;?i++)?{ ??????????????????????//?3个线程都使用pn对象做锁,?以保证每个交替期间只有一个线程在打印 ??????????????????????synchronized?(pn)?{ ??????????????????????????//?如果state!=1,?说明此时尚未轮到线程1打印,?线程1将调用pn的wait()方法,?直到下次被唤醒 ??????????????????????????while?(state?!=?1) ??????????????????????????????try?{ ??????????????????????????????????pn.wait(); ??????????????????????????????}?catch?(InterruptedException?e)?{ ??????????????????????????????????e.printStackTrace(); ??????????????????????????????} ??????????????????????????//?当state=1时,?轮到线程1打印5次数字 ??????????????????????????for?(int?j?=?0;?j??5;?j++)?{ ??????????????????????????????//?打印一次后n自增 ??????????????????????????????System.out.println(Thread.currentThread().getName() ??????????????????????????????????????+?:??+?n++); ??????????????????????????} ??????????????????????????System.out.println(); ??????????????????????????//?线程1打印完成后,?将state赋值为2,?表示接下来将轮到线程2打印 ??????????????????????????state?=?2; ??????????????????????????//?notifyAll()方法唤醒在pn上wait的线程2和线程3,?同时线程1将退出同步代码块,?释放pn锁.? ??????????????????????????//?因此3个线程将再次竞争pn锁 ??????????????????????????//?假如线程1或线程3竞争到资源,?由于state不为1或3,?线程1或线程3将很快再次wait,?释放出刚到手的pn锁.? ??????????????????????????//?只有线程2可以通过state判定,?所以线程2一定是执行下次打
您可能关注的文档
最近下载
- 2025至2030中国人造肌腱和韧带行业细分市场及应用领域与趋势展望研究报告.docx VIP
- 《建筑遮阳工程应用技术标准》(DB37T 5065-2025).docx VIP
- 沪教版 2025-2026 学年上学期七年级生物期末质量检测试卷(附答案).docx VIP
- 沪教版 2025-2026 学年上学期八年级生物期末质量检测试卷(附答案).docx VIP
- 桥式起重机安全检查表.docx VIP
- 2025年事业单位工勤技能-河南-河南电工一级(高级技师)历年参考题库含答案解析(5套).docx VIP
- 英语分级阅读:国家地理《Reading Explorer》A1-A2入门级 REF_unit 5B.pdf VIP
- 小托福单词表汇总(打印版).docx
- 中华人民共和国通信行业标准通信用阀控式密封铅-中国通信标准化协会.PDF VIP
- 四川省成都市高新南区2026届九年级数学第一学期期末考试试题含解析.doc VIP
原创力文档

文档评论(0)