問題描述
啟動3個線程打印遞增的數(shù)字,線程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.程序的輸出結(jié)果應(yīng)該為:
線程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
解法一:
class?PrintRunnable?implements?Runnable?{????private?static?volatile?int?printNum?=?0;????private?int?threadId;????private?Object?o;????public?PrintRunnable(int?threadId,Object?o){????????this.threadId?=?threadId;????????this.o=o;????}????@Override????public?void?run()?{????????while(printNum?<?75){????????????synchronized?(o){????????????????if?(printNum/5%3?+?1?==?threadId){????????????????//該判斷確保對應(yīng)線程輸出????????????????????for?(int?i?=?0;?i?<5;?i++)?{????????????????????????System.out.println("線程"+threadId+":"+(++printNum));????????????????????}????????????????????o.notifyAll();????????????????}else?{????????????????????try?{????????????????????????o.wait();????????????????????}?catch?(InterruptedException?e)?{????????????????????????e.printStackTrace();????????????????????}????????????????}????????????}????????}????}}public?class?Main?{????public?static?void?main(String[]?args)?throws?InterruptedException?{????????Object?o?=?new?Object();????????new?Thread(new?PrintRunnable(1,o)).start();????????new?Thread(new?PrintRunnable(2,o)).start();????????new?Thread(new?PrintRunnable(3,o)).start();????}}
解法二:
public?class?Print123456?implements?Runnable{????private?String?name;????private?Object?prev;????private?Object?self;????private?int?count;????public?Print123456(String?name,Object?prev,Object?self,int?count){????????this.name=name;????????this.prev=prev;????????this.self=self;????????this.count=count;????}????@Override????public?void?run()?{????????while(count<=75){????????????synchronized?(prev){????????????????synchronized?(self){????????????????????for?(int?i=0;i<5;i++){????????????????????????count=count+1;????????????????????????if(count>75)break;????????????????????????System.out.println(name+":?"+count);????????????????????}????????????????????count=count+10;????????????????????//System.out.println("釋放自身鎖,并喚醒在等待該鎖的線程");????????????????????self.notify();//釋放自身鎖,并喚醒在等待該鎖的線程????????????????}????????????????//System.out.println("釋放自身鎖成功");????????????????try?{????????????????????//System.out.println("等待前一個鎖");????????????????????prev.wait();//等待前一個鎖????????????????}?catch?(InterruptedException?e)?{????????????????????e.printStackTrace();????????????????}????????????}????????????//System.out.println("兩個鎖全部釋放,重新進(jìn)入新的循環(huán),但是由于有prev.wait()所以該線程等待獲取prev的鎖");????????}????}}public?class?Main?{????public?static?void?main(String[]?args)?throws?InterruptedException?{????????Object?a=new?Object();????????Object?b=new?Object();????????Object?c=new?Object();????????Print123456?A=new?Print123456("線程1",c,a,0);????????Print123456?B=new?Print123456("線程2",a,b,5);????????Print123456?C=new?Print123456("線程3",b,c,10);????????new?Thread(A).start();????????Thread.sleep(100);????????new?Thread(B).start();????????Thread.sleep(100);????????new?Thread(C).start();????????Thread.sleep(100);????}}
以上就是北大青鳥長沙麓谷校區(qū)java培訓(xùn)機(jī)構(gòu)的小編針對“Java多線程實例練習(xí)題答案”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。