更新時(shí)間:2020-08-13 16:35:51 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2579次
問(wèn)題描述
啟動(dòng)3個(gè)線程打印遞增的數(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){
????????????????//該判斷確保對(duì)應(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("等待前一個(gè)鎖");
????????????????????prev.wait();//等待前一個(gè)鎖
????????????????}?catch?(InterruptedException?e)?{
????????????????????e.printStackTrace();
????????????????}
????????????}
????????????//System.out.println("兩個(gè)鎖全部釋放,重新進(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);
????}
}
以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“Java多線程實(shí)例練習(xí)題答案”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743