В целом это звучит как опасная операция, поскольку, если есть критические сообщения, субъект, обрабатывающий их, может проверить и не найти ни одного, но затем перед выходом может быть получен другой из какого-либо другого потока.
Если выЗнайте наверняка, что это не может произойти, и вам не нужно много невероятно быстрых переключателей сообщений, я, вероятно, написал бы охранника, который считает и отслеживает критические сообщения, но в противном случае просто передает их другому субъекту дляобработка.
Если вы не хотите этого делать, имейте в виду, что детали внутренних компонентов должны измениться, и вам, возможно, придется просмотреть исходный код Actor, Reactor, MessageQueue и т. д. вчтобы получить то, что вы хотите.На данный момент, что-то вроде этого должно работать (предупреждение, не проверено):
package scala.actors
package myveryownstuff
trait CriticalActor extends Actor {
def criticalAwaits(p: Any => Boolean) = {
synchronized {
drainSendBuffer(mailbox)
mailbox.get(0)(p).isDefined
}
}
}
Обратите внимание, что мы должны поместить расширенную черту в пакет scala.actors, потому что все внутренние компоненты почтового ящика объявлены частными для scalaПакет .actors.(Это хорошее предупреждение, что вы должны быть осторожны, прежде чем связываться с внутренностями.) Затем мы добавляем новый метод, который принимает функцию, которая может проверять критическое сообщение и искать его, используя встроенный метод mailbox.get(n)
, который возвращаетn
th-е сообщение, выполняющее некоторый предикат.