第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Java等待和通知:IllegalMonitorStateException

Java等待和通知:IllegalMonitorStateException

一只萌萌小番薯 2019-08-13 15:45:53
Java等待和通知:IllegalMonitorStateException我不完全了解wait和notify(的Object工作),并因此我不得不瘦下來(lái)我嘗試到下面的代碼部分。Main.java:import java.util.ArrayList;class Main{   public static Main main = null;   public static int numRunners = 4;   public static ArrayList<Runner> runners = null;   public static void main(String[] args)   {     main = new Main();   }   Main()   {     runners = new ArrayList<Runner>(numRunners);     for (int i = 0; i < numRunners; i++)     {       Runner r = new Runner();       runners.add(r);       new Thread(r).start();     }     System.out.println("Runners ready.");     notifyAll();   }}Runner.java:class Runner implements Runnable{   public void run()   {     try     {       Main.main.wait();     } catch (InterruptedException e) {}     System.out.println("Runner away!");   }}目前我在調(diào)用時(shí)遇到IllegalMonitorStateException Main.main.wait();,但我不明白為什么。從我所看到的,我需要同步Runner.run,但這樣做我認(rèn)為它只會(huì)通知一個(gè)線程,當(dāng)想法是通知他們所有。我看過(guò)了java.util.concurrent,但我找不到合適的替代品(也許我只是遺漏了一些東西)。
查看完整描述

2 回答

?
守著星空守著你

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超8個(gè)贊

wait()除非當(dāng)前線程擁有該對(duì)象的監(jiān)視器,否則不能在對(duì)象上。要做到這一點(diǎn),你必須synchronize堅(jiān)持:

class Runner implements Runnable{
  public void run()
  {
    try
    {
      synchronized(Main.main) {
        Main.main.wait();
      }
    } catch (InterruptedException e) {}
    System.out.println("Runner away!");
  }}

同樣的規(guī)則也適用于notify()notifyAll()。

Javadoc文檔wait()提到這一點(diǎn):

此方法只應(yīng)由作為此對(duì)象監(jiān)視器所有者的線程調(diào)用。有關(guān)notify線程可以成為監(jiān)視器所有者的方式的說(shuō)明,請(qǐng)參閱方法。

拋出:

IllegalMonitorStateException - 如果當(dāng)前線程不是此對(duì)象監(jiān)視器的所有者。

來(lái)自notify()

線程以三種方式之一成為對(duì)象監(jiān)視器的所有者:

  • 通過(guò)執(zhí)行該對(duì)象的同步實(shí)例方法。

  • 通過(guò)執(zhí)行synchronized在對(duì)象上同步的語(yǔ)句的主體。

  • 對(duì)于類型的對(duì)象Class,通過(guò)執(zhí)行該類的同步靜態(tài)方法。


查看完整回答
反對(duì) 回復(fù) 2019-08-13
?
三國(guó)紛爭(zhēng)

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超7個(gè)贊

你打電話都waitnotifyAll不使用synchronized塊。在這兩種情況下,調(diào)用線程必須擁有您調(diào)用方法的監(jiān)視器上的鎖。

從文檔notifywaitnotifyAll有類似的文檔,但參考notify最完整的描述):

此方法只應(yīng)由作為此對(duì)象監(jiān)視器所有者的線程調(diào)用。線程以三種方式之一成為對(duì)象監(jiān)視器的所有者:

  • 通過(guò)執(zhí)行該對(duì)象的同步實(shí)例方法。

  • 通過(guò)執(zhí)行在對(duì)象上同步的synchronized語(yǔ)句的主體。

  • 對(duì)于Class類型的對(duì)象,通過(guò)執(zhí)行該類的同步靜態(tài)方法。

一次只有一個(gè)線程可以擁有對(duì)象的監(jiān)視器。

只有一個(gè)線程能夠一次實(shí)際退出 wait,notifyAll因?yàn)樗麄兌急仨氃俅潍@得相同的監(jiān)視器 - 但是所有線程都會(huì)被通知,所以只要第一個(gè)線程退出同步塊,下一個(gè)將獲得鎖等


查看完整回答
反對(duì) 回復(fù) 2019-08-13
  • 2 回答
  • 0 關(guān)注
  • 425 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)