Si no hay un subproceso en espera, utilizando Object.wait()
, las llamadas a Object.notify()
o Object.notifyAll()
no tienen ningún efecto. Tengo un escenario en el que si llamo al Object.notify()
cuando el conjunto de espera está vacío, una llamada posterior a Object.wait()
no debe poner el hilo en espera. ¿Cómo se puede lograr esto? Los semáforos pueden ser una solución en la que puedo pensar. ¿Hay una solución más elegante?llamando a Object.notify() antes de Object.wait()
Respuesta
Este tipo de escenario parece ser un ajuste perfecto para un Semaphore
. Llame al Semaphore.release()
en lugar de notify()
y Semaphore.acquire()
en lugar de esperar.
Utilice una bandera para indicar una notificación. Lea la bandera antes de ingresar a esperar y actúe en consecuencia.
boolean stopped = false;
public void run(){
synchronized(object){
while(!stopped)
object.wait();
}
}
public void stop(){
synchronized(object){
stopped=true;
object.notify();
}
}
me gustaría utilizar Semaphore
, CyclicBarrier
o posiblemente CountDownLatch
- lo que es una mejor opción para su escenario real. Creo que es una buena idea reutilizar las abstracciones existentes en lugar de utilizar los mecanismos de bajo nivel usted mismo, a menos que esos mecanismos le den exactamente el comportamiento que desea (que no lo hacen en este caso).
Gracias por el buen consejo. Supongo que entonces Semaphore funciona mejor para el escenario que tengo. –
he implementado como este
Tema 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);
}
}
Tema B:
synchronized (req) {
while (!responseRecieved) {
try {
req.wait(3000);
} catch (InterruptedException ex) {
logger.error("Error waiting on req while trying to get state", ex);
}
}
}
Tema A hace la solicitud y espera una respuesta, mientras tanto Tema B es solo esperando la respuesta. Si una respuesta ya ha llegado, no espera.
- 1. viewDidLoad llamando antes de init?
- 2. CPU Usage y Object.wait
- 3. Llamando a OnActionExecuting de FilterAttribute antes de OnController's OnActionExecuting
- 4. ¿Se está llamando a ViewDidLoad antes de initWithNibName?
- 5. Llamando al constructor de clase hijo antes del constructor padre
- 6. Segue no llamando a prepareForSegue
- 7. Llamando a Async Tarea
- 8. Métodos de instancia llamando a métodos de clase llamando a los métodos de instancia
- 9. Llamando a PowerShell desde NodeJS
- 10. Llamando a Clojure desde .NET
- 11. Llamando a Perl desde php?
- 12. Llamando a Parent Class Methods
- 13. Llamando a setContentView() varias veces
- 14. Llamando a Clojure desde dentro de R?
- 15. llamando a funciones de ensamblado desde c
- 16. Error de NAudio: "NoDriver llamando a acmFormatSuggest"
- 17. llamando a operadores de clase base ... ¿seguros?
- 18. Error de GWT Blobstore llamando a createUploadUrl()
- 19. Llamando a GetGUIThreadInfo a través de P/Invoke
- 20. Llamando a la concordancia de NLTK - ¿cómo obtener texto antes/después de una palabra que se usó?
- 21. llamando a un método en el modelo de la vista
- 22. Operación Java: clone() llamando a super.clone()
- 23. llamando a la función php desde jquery?
- 24. llamando a los métodos C++ desde C
- 25. llamando a un servlet java desde javascript
- 26. llamando a la función c desde C#
- 27. Llamando a C# dll en vbscript
- 28. llamando a Restful Service desde Java
- 29. UIScrollview llamando a superviews layoutSubviews when scrolling?
- 30. Llamando a IPrincipal.IsInRole en Windows 7
Gracias por la respuesta rápida. –
+1: Cualquier cambio de estado puede registrar el hecho de que se llamó a notify() anteriormente. –