真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何使用wait()和notify()機(jī)制來(lái)完成睡眠和踢

今天就跟大家聊聊有關(guān)如何使用wait() 和notify() 機(jī)制來(lái)完成睡眠和踢,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)建站專注于企業(yè)全網(wǎng)整合營(yíng)銷推廣、網(wǎng)站重做改版、金平網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5網(wǎng)站設(shè)計(jì)、商城建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為金平等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。

使用 wait() 和 notify() 機(jī)制來(lái)完成“睡眠”和“踢”。實(shí)際的消費(fèi)者工作由 OnConsume(Object) 方法處理,如清單 3 所示:
清單 3. 喚醒和通知 Consumer
/**

* Add an object to the Consumer.

* This is the entry point for the producer.

* After the item is added, the Consumer´s thread

* will be notified.

*

* @param the object to be ´consumed´ by this consumer

*/

public void add(Object o)

{

_queue.add(o);

kickThread();

}



/**

* Wake up the thread (without adding new stuff to consume)

*

*/

public void kickThread()

{

if (!this._thread.isInterrupted())

{

synchronized(_waitForJobsMonitor)

{

_waitForJobsMonitor.notify();

}

}

}



示例:MessagesProcessor

為了向您展示 Consumer 類是如何工作的,我們將使用一個(gè)簡(jiǎn)單示例。MessagesProcessor 類以異步方式處理進(jìn)入的消息(也就是說(shuō),不干擾調(diào)用線程)。其工作是在每個(gè)消息到來(lái)時(shí)打印它。MessagesProcessor 具有一個(gè)處理到來(lái)的消息作業(yè)的內(nèi)部 Consumer。當(dāng)新作業(yè)進(jìn)入空隊(duì)列時(shí),Consumer 調(diào)用 processMessage(String) 方法來(lái)處理它,如清單 4 所示:



清單 4. MessagesProcessor 類

class MessagesProcessor

{

String _name;

// anonymous inner class that supplies the consumer

// capabilities for the MessagesProcessor

private Consumer _consumer = new Consumer()

{

// that method is called on each event retrieved

protected void onConsume(Object o)

{

if (!(o instanceof String))

{

System.out.println("illegal use, ignoring");

return;

}

MessagesProcesser.this.processMessage((String)o);

}

}.setName("MessagesProcessor").init();



public void gotMessageEvent(String s)

{

_consumer.add(s);

}

private void processMessage(String s)

{

System.out.println(_name+" processed message: "+s);

}

private void terminate()

{

_consumer.terminateWait();

_name = null;

}

MessagesProcessor()

{

_name = "Example Consumer";

}

}



正如您可以從上面的代碼中所看到的,定制 Consumer 相當(dāng)簡(jiǎn)單。我們使用了一個(gè)匿名內(nèi)部類來(lái)繼承 Consumer 類,并重載抽象方法 onConsume()。因此,在我們的示例中,只需調(diào)用 processMessage。



Consumer 類的高級(jí)特性

除了開(kāi)始時(shí)提出的基本需求以外,我們還為 Consumer 類提供了一些我們覺(jué)得有用的高級(jí)特性。



事件通知

onThreadTerminate():只在終止 Consumer 前調(diào)用該方法。我們出于調(diào)試目的覆蓋了這個(gè)方法。


goingToRest():只在 Consumer 線程進(jìn)入休眠前調(diào)用該方法(也就是說(shuō),只在調(diào)用 _waitForJobsMonitor.wait() 之前調(diào)用)。只在需要消費(fèi)者在進(jìn)入休眠之前處理一批已處理工作的復(fù)雜情況中,可能需要這種通知。

終止


terminate():Consumer 線程的異步終止。

terminateWait():設(shè)置調(diào)用線程一直等待,直到消費(fèi)者線程實(shí)際終止為止。

在我們的示例中,如果使用 terminate() 而不是 terminateWait(),那么將會(huì)出現(xiàn)問(wèn)題,因?yàn)樵趯?_name 設(shè)置成空值之后調(diào)用 onConsume() 方法。這將導(dǎo)致執(zhí)行 processMessage 的線程拋出一個(gè) NullPointerException。

結(jié)束語(yǔ):Consumer 類的好處

可在參考資料一節(jié)下載 Consumer 類的源代碼。請(qǐng)自由使用源代碼,并按照您的需要擴(kuò)展它。我們發(fā)現(xiàn)將這個(gè)類用于多線程應(yīng)用程序開(kāi)發(fā)有許多好處:

代碼重用/重復(fù)代碼的消除:如果您有 Consumer 類,就不必為您應(yīng)用程序中的每個(gè)實(shí)例編寫(xiě)一個(gè)新的消費(fèi)者。如果在應(yīng)用程序開(kāi)發(fā)中頻繁使用生產(chǎn)者-消費(fèi)者方案,這可以很大程度地節(jié)省時(shí)間。另外,請(qǐng)牢記重復(fù)代碼是滋生錯(cuò)誤的沃土。它還使基本代碼的維護(hù)更為困難。

更少錯(cuò)誤:使用驗(yàn)證過(guò)的代碼是一種防止錯(cuò)誤的好實(shí)踐,尤其是處理多線程應(yīng)用程序時(shí)。因?yàn)?Consumer 類已經(jīng)被調(diào)試過(guò),所以它更安全。消費(fèi)者還通過(guò)在線程和資源之間擔(dān)任安全中介來(lái)防止與線程相關(guān)的錯(cuò)誤。消費(fèi)者可以代表其它線程以順序的方式訪問(wèn)資源。

漂亮、清晰的代碼:使用 Consumer 類有助于我們編寫(xiě)出更簡(jiǎn)單的代碼,這樣的代碼更容易理解和維護(hù)。如果我們不使用 Consumer 類,就必須編寫(xiě)代碼來(lái)處理兩種不同的功能:消費(fèi)邏輯(隊(duì)列和線程管理、同步等)和指定消費(fèi)者的用法或功能的代碼。

看完上述內(nèi)容,你們對(duì)如何使用wait() 和notify() 機(jī)制來(lái)完成睡眠和踢有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。


當(dāng)前名稱:如何使用wait()和notify()機(jī)制來(lái)完成睡眠和踢
轉(zhuǎn)載注明:http://weahome.cn/article/peegpg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部