如果沒有線程在等待,使用Object.wait()
,則任何對Object.notify()
或Object.notifyAll()
的調用都不起作用。我有一種情況,如果在等待集爲空時調用Object.notify()
,則後續調用Object.wait()
時不應讓該線程等待。這如何實現?信號量可能是我能想到的一個解決方案。有沒有更優雅的解決方案?在Object.wait()之前調用Object.notify()
5
A
回答
7
這種情況似乎是一個完美的適合Semaphore
。請致電Semaphore.release()
而不是notify()
和Semaphore.acquire()
而不是等待。
7
使用標誌來指示通知。在進入等待之前閱讀標誌並採取相應措施。
boolean stopped = false;
public void run(){
synchronized(object){
while(!stopped)
object.wait();
}
}
public void stop(){
synchronized(object){
stopped=true;
object.notify();
}
}
4
我會用Semaphore
,CyclicBarrier
或可能CountDownLatch
- 無論是你真實的情景更適合。我認爲重複使用現有的抽象是一個好主意,而不是自己使用底層機制,除非這些機制給予你完全想要的行爲(在這種情況下他們不這樣做)。
+0
感謝您的好建議。我想信號量對我所擁有的場景來說是最好的。 –
0
我實現像這樣
線程A:
req.run();
synchronized (req) {
try {
req.wait(3000);
rawResponse = eq.ReturnXML;
logger.info("[" + refID + "] Response recieved: " + rawResponse);
responseRecieved = true;
req.notify();
} catch (InterruptedException ex) {
logger.error("Error waiting on req", ex);
}
}
線程B:
synchronized (req) {
while (!responseRecieved) {
try {
req.wait(3000);
} catch (InterruptedException ex) {
logger.error("Error waiting on req while trying to get state", ex);
}
}
}
線程A使一個響應該請求並等待,在此同時線程B是隻等待迴應。如果響應已經到達,它不會等待。
相關問題
- 1. 什麼時候調用Object.wait
- 2. Android - onConfigurationChanged()在暫停之前調用Activity之前調用Activity
- 3. onResume在onMapReady之前調用
- 4. 在initWithNibName之前調用ViewDidLoad?
- 5. viewDidLoad在applicationDidFinishLaunching之前調用
- 6. viewDidLoad在init之前調用?
- 7. viewDidLoad在IBAction之前調用?
- 8. CGContextMoveToPoint在CGContextShowText之前調用
- 9. 在CoCreateInstance之前調用QueryInterface?
- 10. NSPressGestureRecognizer在minimumPressDuration之前調用
- 11. FB.login()在調用FB.init()之前調用
- 12. Thread.sleep和object.wait
- 13. 之前添加元素之前調用
- 14. CPU使用率和Object.wait
- 15. coffeescript:在調用之前定義回調
- 16. 爲什麼RAD在調試模式下在Object.wait調用上跳轉?
- 17. 如何在java中使用Object.wait(long)?
- 18. 使用Promise.All與Firebase Cloud Fxs在sendToDevice之前調用FCM標記之前調用
- 19. 在調用方法之前使用'this'。
- 20. onCreateView()用於在Activity之前調用onRestoreInstanceState()
- 21. 在繼續之前等待API調用以Javascript完成之前
- 22. FB.getLoginStatus()調用之前調用FB.init()錯誤
- 23. onActivityResult()之前調用onResume()?
- 24. ASM調用之前PUSH
- 25. onPageSelected被調用之前onViewCreated
- 26. onCreateOptionsMenu調用之前onCreate android
- 27. numberOfRowsInSection之前調用openWithCompletionHandler塊
- 28. 之前調用這個()
- 29. heightForRowAtIndexPath之前調用cellForRowAtIndexPath
- 30. Fragment.onstart之前被調用Activity.onstart
感謝您的快速響應。 –
+1:任何狀態改變都可以記錄notify()被調用的事實。 –