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

  • 2
  • 0
  • 约1.19万字
  • 约 7页
  • 2017-04-12 发布于四川
  • 举报

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

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一定是执行下次打

文档评论(0)

1亿VIP精品文档

相关文档