Esto suena como una operación peligrosa en general, ya que si hay mensajes críticos, el actor que los procesa podría verificar y no encontrar ninguno, pero antes de salir podría obtener otro de otro hilo.
Si sabe con certeza que esto no puede suceder, y no necesita muchos interruptores de mensajes increíblemente rápidos, probablemente escribiría un guardia-actor que cuenta y realiza un seguimiento de los mensajes críticos, pero de lo contrario simplemente pasa ellos a otro actor para el manejo.
Si no desea hacer eso, tenga en cuenta que los detalles de las partes internas deberían cambiar y es posible que tenga que pasar por el código fuente de Actor, Reactor, MessageQueue, etc. para obtener usted quiere. Por ahora, algo como esto debería funcionar (advertencia, no probado):
package scala.actors
package myveryownstuff
trait CriticalActor extends Actor {
def criticalAwaits(p: Any => Boolean) = {
synchronized {
drainSendBuffer(mailbox)
mailbox.get(0)(p).isDefined
}
}
}
Tenga en cuenta que tenemos que colocar el rasgo extendido en el paquete scala.actors, porque todas las partes internas de buzón se declaran privado a los scala.actors paquete. (Esta es una buena advertencia de que debe tener cuidado antes de meterse con las partes internas.) Luego agregamos un nuevo método que toma una función que puede probar un mensaje crítico y lo busca utilizando el método integrado mailbox.get(n)
que devuelve el n
th mensaje cumpliendo algún predicado.
enfoque muy interesante –