ObjetoSemáforo
objeto de semáforo de fibra
El objeto semáforo gestiona un contador interno, que se reduce en uno después de llamar a adquirir o esperar, y se incrementa en uno después de llamar a liberar o publicar. El contador no disminuirá a un número negativo, porque cuando la adquisición y la espera descubren que el valor es 0, suspenderán la fibra actual hasta que otras fibras aumenten el valor del contador mediante liberación o publicación.
Las ocasiones comúnmente utilizadas para los semáforos son limitar el uso concurrente de recursos y la aplicación del modelo productor/consumidor.
Tome las solicitudes de bases de datos como ejemplo para limitar el uso concurrente de recursos:
1
2
3
4
5
6
7
8
9
10var maxconnections = 5;
var l = new coroutine.Semaphore(maxconnections);
......
l.acquire();
var conn = connectdb()
.....
conn.close();
l.release();
El patrón productor/consumidor suele utilizar semáforos con colas. El productor agrega datos a la cola y publica una señal, el consumidor primero espera la señal, la obtiene y luego va a la cola para consultar los datos.
relación de herencia
Constructor
Semaphore
constructor de semáforos
1new Semaphore(Integer value = 1);
Parámetros de llamada:
- value: Entero, valor inicial del contador
función miembro
wait
espera un semáforo
1Boolean Semaphore.wait(Integer timeout = -1);
Parámetros de llamada:
- timeout: Entero, especifica el tiempo de espera en milisegundos. El valor predeterminado es -1, lo que significa que nunca expirará.
Resultados de devolución:
- Boolean, devuelve verdadero si la adquisición es exitosa, devuelve falso si se agota el tiempo de espera.
post
Liberar un semáforo, equivalente a liberar()
1Semaphore.post();
trywait
Intente adquirir una señal, si no se puede adquirir, regresará inmediatamente y devolverá falso, lo que equivale a adquirir (falso)
1Boolean Semaphore.trywait();
Resultados de devolución:
- Boolean, devuelve verdadero si la adquisición es exitosa, devuelve falso si se agota el tiempo de espera.
acquire
Obtener la propiedad de la cerradura
1Boolean Semaphore.acquire(Boolean blocking = true);
Parámetros de llamada:
- blocking: Booleano, especifica si se debe esperar, esperar cuando sea verdadero, el valor predeterminado es verdadero
Resultados de devolución:
- Boolean, devuelve si el bloqueo se adquirió correctamente; verdadero indica que la adquisición se realizó correctamente.
El método de adquisición se utiliza para obtener la propiedad del candado. Cuando el candado está en estado adquirible, este método devuelve verdadero inmediatamente.
Cuando no se puede adquirir el bloqueo y el bloqueo es verdadero, la fibra actual entra en modo de suspensión. Cuando otras fibras liberan el bloqueo, este método devuelve verdadero.
Cuando no se puede adquirir el bloqueo y el bloqueo es falso, el método devuelve falso.
release
Liberar la propiedad de la cerradura
1Semaphore.release();
Este método liberará la propiedad del candado o generará un error si la fibra actual no es propietaria del candado.
count
Consultar el número actual de tareas en espera.
1Integer Semaphore.count();
Resultados de devolución:
- Integer, devuelve el número de tareas
toString
Devuelve la representación de cadena del objeto. Generalmente, se devuelve "[Objeto nativo]". El objeto se puede volver a implementar de acuerdo con sus propias características.
1String Semaphore.toString();
Resultados de devolución:
- String, devuelve la representación de cadena del objeto
toJSON
Devuelve una representación en formato JSON del objeto, que generalmente devuelve una colección de propiedades legibles definidas por el objeto.
1Value Semaphore.toJSON(String key = "");
Parámetros de llamada:
- key: Cadena, no utilizada
Resultados de devolución:
- Value, devuelve un valor que contiene JSON serializable