При использовании asynchronoussocketchannel.write для передачи сообщения,
Код: Выделить всё
class Transmitter(channel: AsynchronousSocketChannel) {
def transmit(bytes: Array[Byte])(onComplete: Consumer[String]): Unit = {
val buffer = ByteBuffer.wrap(bytes)
object handler extends CompletionHandler[Integer, Null] {
override def completed(result: Integer, attachment: Null): Unit = {
if result == 0 then onComplete.accept("Failure: connection closed prematurely")
else if buffer.hasRemaining then channel.write(buffer, null, handler)
else onComplete.accept("Successful")
}
override def failed(exc: Throwable, attachment: Null): Unit = onComplete.accept("Failure: connection error")
}
channel.write(buffer, null, handler)
}
}
Метод завершения handhandler.completed может быть вызван до отправки всего содержимого буфера, верно? Чтобы обратиться с этим случаем, выполненный метод должен вызвать Asynchronoussocketchannel.write Еще раз, верно? выполнено в другом потоке группы Nio2, и документация Buffer < /code> говорит, что она не безопасна для потока (его переменные состояния даже не нестабильны). Отправьте оставшееся содержание буфера без чтения буфера, и его нельзя надежно прочитать. Последовательно), но наглядно: поток, который запускает выполняемый метод , может не увидеть изменения переменных состояния Buffer , сделанные потоком, в котором называется write или поток, который выполнял завершенные a Предыдущий раз.
Методы внутри. ). Делай или не требует быть изменчивым.
Подробнее здесь:
https://stackoverflow.com/questions/794 ... ry-fence-b