亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

關于多線程的問題 麻煩各位大佬進來看看 指導指導 十分感謝

關于多線程的問題 麻煩各位大佬進來看看 指導指導 十分感謝

Dusdii 2019-05-16 11:19:12
問題:?Baozipu類和Chihuo類都創建了Baozi的對象為什么main方法還要傳個Baozi的對象參數進去呢?這里有點不解?難道是因為鎖? package?cn.XianCheng; public?class?Baozipu?extends?Thread{ ????//創建一個包子類型的變量 ????????Baozi?bz?=?new?Baozi(); ????//使用帶參構造方法為這個包子賦值 ????public?Baozipu(Baozi?cz){ ????????this.bz?=?cz?; ????} ????//設置線程任務生產包子 ????@Override ????public?void?run()?{ ????????????while(true){ ????//必須使用同步技術保證只有一個線程在執行??這里用?同步代碼塊 ????????synchronized(bz){ ????????//判斷有沒有包子 ????????????if(bz.flag==true){ ?????????????//有包子包子鋪就進入等待狀態 ????????????????bz.notify(); ????????????????try?{ ????????????????????bz.wait(); ????????????????}?catch?(InterruptedException?e)?{ ????????????????????e.printStackTrace(); ????????????????} ????????????} ????????????if(bz.flag==false){ ????????????//沒有包子就生產包子 ???????????????bz.pi?=?"薄皮"; ???????????????bz.xian?=?"牛肉餡"; ????????????????System.out.println("正在生產包子"+Thread.currentThread().getName()); ????????????????try?{ ????????????????????Thread.sleep(1000); ????????????????}?catch?(InterruptedException?e)?{ ????????????????????e.printStackTrace(); ????????????????} ????????????????bz.flag?=?true; ????????????????System.out.println("包子鋪已經生產好了:"+bz.pi+bz.xian+"包子"+Thread.currentThread().getName()); ????????????????bz.notify(); ????????????????try?{ ????????????????????Thread.sleep(1000); ????????????????}?catch?(InterruptedException?e)?{ ????????????????????e.printStackTrace(); ????????????????} ????????????} ????????} ???????} ????} }-------------------------------------------------------------------------------------------------------------package?cn.XianCheng; public?class?Chihuo?extends?Thread{ ????????Baozi?bz?=?new?Baozi(); ????????public?Chihuo(Baozi?cz){ ????????????this.bz?=?cz?; ????????} ????@Override ????public?void?run()?{ ????????while(true){ ????????????synchronized?(bz){ ????????????????if(bz.flag?==?false){ ????????????????????bz.notify(); ????????????????????try?{ ????????????????????????bz.wait(); ????????????????????}?catch?(InterruptedException?e)?{ ????????????????????????e.printStackTrace(); ????????????????????} ????????????????} ????????????????if(bz.flag?==?true){ ????????????????????System.out.println("正在吃:"+bz.pi+bz.xian+"包子"+Thread.currentThread().getName()); ????????????????????try?{ ????????????????????????Thread.sleep(1000); ????????????????????}?catch?(InterruptedException?e)?{ ????????????????????????e.printStackTrace(); ????????????????????} ????????????????????bz.flag?=?false?; ????????????????????System.out.println("吃完了"+Thread.currentThread().getName()); ????????????????????System.out.println("-------------------------------------"); ????????????????????bz.notify(); ????????????????????try?{ ????????????????????????Thread.sleep(1000); ????????????????????}?catch?(InterruptedException?e)?{ ????????????????????????e.printStackTrace(); ????????????????????} ????????????????} ????????????} ????????} ????} }--------------------------------------------------------------------------------------------------package?cn.XianCheng; public?class?Baozi?{ ????//皮 ????//餡 ????//包子的狀態 ?????String?pi; ?????String?xian; ?????boolean?flag?=?false; }--------------------------------------------------------------------------------------------------package?cn.XianCheng; public?class?XianChengmain?{ ???? ????public?static?void?main(String[]?args)?{ ????????????Baozi?cz?=?new?Baozi();//創建包子對象 ????????????new?Baozipu(cz).start();//開啟包子鋪線程 ????????????new?Chihuo(cz).start();//開啟吃貨線程 ????} }
查看完整描述

3 回答

?
pardon110

TA貢獻1038條經驗 獲得超227個贊

多線程執行(由線程調度器管理)是無序交替(無規律)。正常邏輯包子鋪生產,吃貨類消費,它們所用的是同一批包子。你現在的代碼就好像,包子鋪,吃貨有各自的包子,但都只對第三方(主線程)運過來(new)的包子感興趣。三個線程地位相等,然后搶著執行(線程啟動順序不代表執行順序)。為確保成功消費包子,需要明確各線程執行體得到的結果有序,即生產(包子鋪)包子 -> 運輸(主線程)->消費(吃貨)。因此需要線程通信協調,讓各線程執行流有序,有了鎖解決資源共享能不能用的問題,有了同步解決數據一致性問題,三個線程的通信也依賴于那個主線程包子實例,實例notify與wait方法則告訴其它線程該對象鎖是否解除,當前線程是否需要阻塞,來控制線程間執行流。換而言之,如果你不傳包子對象,相當于兩個子線程,各自玩自家的包子,與主線程包子無關,那也沒必要用到鎖,用到同步,更不需要多線程了。

查看完整回答
反對 回復 2019-05-20
  • 3 回答
  • 0 關注
  • 910 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號