2013-05-18 61 views
0

我想在線程中創建一些內容,使其返回所做的字符串,並且希望等待該字符串完成其他任務。我一直在閱讀有關wait()notify(),但我力求得到它。誰能幫我?不知道如何在Java中使用wait()和notify()

在這裏,我創建一個具有操作

new Thread(

new Runnable() { 

    @Override 
    public void run() { 

     synchronized(mensaje) { 

      try { 
       mensaje.wait(); 
       mensaje = getFilesFromUrl(value); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

     } 
    } 

}).start(); 

這裏,我等待字符串mensaje改變

如果字符串不是「線程」,那麼我告訴一個按鈕和一些文字

synchronized(mensaje) { 

    if (mensaje.equals("")) { 

     try { 
      mensaje.wait(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

    } 

    btnOk.setVisibility(View.VISIBLE); 
    lblEstado.setText(mensaje); 
} 

所有這些凝灰岩是一種方法

+0

看看併發實用程序。 Callable和Future是知道那裏的主要接口。 – Thilo

+1

什麼是你的問題? – Blackbelt

+0

Ops,我忘了寫問題... – mesacuadrada

回答

0

notify()notifyAll()wait()的基本工作原理是這樣的內部:

當你調用wait()它釋放所採取的synchronized塊,並把當前線程睡在隊列互斥。

notify()從隊列的前端抓取一個等待線程。該線程重新獲取互斥鎖並繼續運行。

notifyAll()喚醒隊列中的所有線程。

在這裏使用,這是一些僞(沒有異常處理等要多一點清晰):

// in the thread that is supposed to wait 
synchronized { 
    while(!someCondition) { 
     wait(); 
    } 
    // At this point the other thread has made the condition true and notified you. 
} 


// In the other thread 
synchronized { 
    // Do something that changes someCondition to true. 
    notifyAll(); 
} 

編輯: 或者像蒂洛先寫一下java.util.concurrent中。您的用例可能已經有了現成的解決方案。那麼不需要使用低級構造。

更正:對於您的用例一個現成的解決方案: http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html

和相應的執行程序。

+0

好的,這似乎很容易,但沒有工作,只是沒有做任何事情。我只是想禁用一些按鈕,並在線程活動後啓用它們...但它變得複雜了! – mesacuadrada

+0

我在代碼中看到的一個問題是兩個線程都調用wait()。兩個線程都使用notify()嗎?否則,這會導致兩個線程都阻塞並等待一個永遠不會到來的notify()。 編輯: 我剛剛注意到你上面的評論。你是否從synchronized塊中調用notify()?如果您在致電通知時沒有拿着顯示器,它將不起作用。 – confusopoly

+0

這是一個沒有意識到的錯誤,但我不能輸入新的代碼...我從主線程調用wait()並從新線程調用notify()... – mesacuadrada

相關問題