执行绪的同步.PPTVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

*執行緒間相互合作的問題*執行緒間相互合作的問題*執行緒間相互合作的問題*執行緒間相互合作的問題*執行緒間相互合作的問題其中22~35行就是用來表示選舉總部助理的Assistant類別。這個類別只有2個方法,分別是用來讓PollingStation物件呼叫,以回報新增得票數的reportCount()方法,以及提供給主流程取得新增票數的getCount()方法。由於這2個方法都必須存取共用的資源count,所以都以synchronized來控制存取count變數的同步。*執行緒間相互合作的問題reportCount()方法中是顯示並且記錄回報的票數,而getCount()方法就很單純的傳回count。PollingStation類別的內容和之前的範例幾乎一樣,不同的只是原來記錄Vote物件的變數改成記錄Assistant物件,並且一併改成呼叫Assistant類別的reportCount()方法回報新增票數。*執行緒間相互合作的問題在main()方法中,先產生代表助理的Assistant物件,然後一一產生各個開票所的PollingStation物件,啟動執行緒。然後使用for迴圈依據開票所的數量以及個別開票所回報新增票數的次數呼叫Assistant的getCount()方法,取得新增票數加總。最後,顯示各開票所的總票數以及加總的總票數。*執行緒間相互合作的問題*執行緒間相互合作的問題最後的結果明明兩個開票所分別有897及1045票,怎麼總票數會是1088票呢?仔細看執行結果會發現,主流程在開票所還沒有回報票數時,就已經先呼叫getCount()兩次。更糟的是,總部負責人還沒有將記錄下來的新增票數加總,就又把傳回的新增票數記錄到count變數中,蓋掉了之前的數值,以致於最後的1088票其實是2號開票所最後一次傳回的136票乘上8次的結果。*執行緒間相互合作的問題這個程式的問題就出在各個執行緒間並沒有協調好,助理應該告訴總部負責人現在沒有資料,請等候;相同的道理,助理也應該要知道負責人還沒加總好資料,先不要把資料記下來,蓋掉舊的資料。*協調執行緒為了解決上述的問題,很顯然的,必須修改Assistant類別,讓它扮演好助理的角色。在Object類別中,提供有一對方法:wait()與notify(),wait()可以讓目前的執行緒進入等待狀態,直到有別的執行緒呼叫同一個物件的notify()方法叫醒,才會繼續執行。因此,我們就可以呼叫Assistant物件的這一對方法來協調回報新增票數與加總票數的工作:*協調執行緒*協調執行緒*協調執行緒第24行新增了unprocessedData成員,用來表示是否有新增的票數還未加總。*協調執行緒第29行的while迴圈會在還有新增票數未加總時讓代表開票所的執行緒等待,等待的方式就是呼叫Assistant物件的wait()方法,進入等待狀態。一旦被喚醒繼續執行,就會將新增票數記錄下來,將unprocessedData設為true,告訴助理可以加總票數了。然後呼叫notify(),讓等待加總票數的主流程可以繼續執行。*協調執行緒第43的while迴圈會在沒有新增票數需要加總時,讓負責加總的主流程等待,等待的方式一樣是呼叫Assistant物件的wait()方法。一旦被喚醒繼續執行時,就會將unprocessedData設為false,並呼叫Assistant物件的notify()方法,以便喚醒等待回報新增票數的執行緒,讓開票所能夠繼續回報新增票數。*協調執行緒如此一來,執行結果就完全正確了:*協調執行緒要注意的是,對於物件a來說,只有在物件a的synchronized方法或是以a為共享資源的synchronized(a)區塊中才能呼叫a的wait()方法。一旦執行緒進入等待狀態時,就會暫時釋放其synchronized狀態,就好像這個執行緒已經離開synchronized方法或是區塊一樣,讓其他的執行緒可以呼叫同一方法或是進入同一區塊。*協調執行緒等到其他執行緒呼叫notify()喚醒等待的執行緒時,被喚醒的執行緒必須等到可以重新進入synchronized狀態時才能繼續執行。舉例來說,如果您把reportCount()

您可能关注的文档

文档评论(0)

189****0266 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档