java - tiempo - manual de programacion android pdf
¿Cómo diferenciar cuándo esperar(tiempo de espera largo) salir para notificar o tiempo de espera? (7)
Teniendo esta declaración de espera:
public final native void wait(long timeout) throws InterruptedException;
Podría salir por InterruptedException, o por tiempo de espera, o porque se llamó al método Notify / NotifyAll en otro hilo, la excepción es fácil de detectar pero ...
¿Hay alguna forma de saber si la causa de las salidas fue tiempo de espera o notificación?
EDITAR:
Esta es una manera difícil que podría funcionar, (aunque no me gusta)
long tBefore=System.currentTimeMillis();
wait(TIMEOUT);
if ((System.currentTimeMillis() - tBefore) > TIMEOUT)
{
//timeout
}
Debe utilizar el método de no esperar / notificar.
Será mejor usar Lock with Condidions https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Condition.html#await-long-java.util.concurrent.TimeUnit-
Tiene espera con tiempo de espera y devolverá falso si el tiempo de espera transcurrió de manera detectable antes de regresar del método, de lo contrario verdadero
Esto no responde exactamente a la pregunta, pero probablemente resolverá su problema: use mecanismos de concurrencia de nivel superior. Esperar / notificar es generalmente más bajo de lo que se desearía, por esta razón entre muchas otras.
Por ejemplo, si estaba usando BlockingQueue.poll(long, TimeUnit)
, podría verificar si el resultado es nulo para saber si se agotó el tiempo.
Hay una razón más por la que se puede devolver la notificación: activación falsa. Esto es algo improbable pero posible, porque la prevención de activaciones falsas es muy costosa en algunas combinaciones de hardware / sistema operativo.
Debido a esto, siempre tiene que llamar a wait () en un bucle y volver a verificar la condición que está esperando. Durante este trabajo es fácil verificar el tiempo de espera al mismo tiempo.
Para más detalles recomiendo el libro "Java Concurrency In Practice". Y utilizando construcciones de nivel superior que harán que todo esto sea correcto para usted.
La excepción no se produce en la notificación y el tiempo de espera.
Creo que es mejor confiar en los objetos de sincronización de paquetes java.lang.concurrent
en lugar de usar Object.wait()
.
No puede diferenciar entre los dos a menos que proporcione algún código adicional. Por ejemplo, agregando un ThreadLocal
Boolean
que se establece en true
solo en notify()
Pero primero debes asegurarte de que tu lógica requiere esta diferenciación.
No use System.currentTimeMillis()
, use System.nanoTime()
lugar.
El primero mide el tiempo absoluto (basado en el reloj del sistema) y puede tener resultados curiosos si se cambia la hora del sistema. Por ejemplo: una espera de 5 segundos puede tener una duración de una hora si el reloj se mueve hacia atrás una hora, o una espera de 10 minutos se realizará después de 0 segundos si el reloj se mueve hacia adelante.
El segundo mide el tiempo relativo. Siempre se ejecutará en una dirección a velocidad constante, pero no tiene origen . Eso significa que los valores solo pueden usarse para medir el tiempo relativo, pero pueden y no deben usarse para determinar una fecha.
No hay forma de saberlo directamente , es decir, tendría que agregar un código adicional para determinar esto. A menudo, cuando espera (), está esperando que suceda algo que cambie el estado de un objeto de alguna manera, por ejemplo, configurando una variable booleana, tal vez. Si ese es el caso, entonces puede simplemente verificar el estado de esa variable para ver si ocurrió el evento, o simplemente se agotó el tiempo. O puede mirar el valor de System.currentTimeMillis () para ver si el tiempo transcurrido es mayor o igual que el tiempo de espera. Si lo es, sería una pista que probablemente haya agotado (aunque no es una garantía absoluta). ). O si el tiempo transcurrido es menor que el período de tiempo de espera, entonces ciertamente no ha expirado. ¿Eso ayuda?