жду бесперебойно в нетто - PullRequest
       4

жду бесперебойно в нетто

1 голос
/ 09 декабря 2011

Я думал, что awaitUninterruptibly означает выполнение кода блока до завершения операции, но, похоже, не так:

public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
    ChannelFuture f = e.getChannel().close();
    f.awaitUninterruptibly(); // ok, not netty i/o thread, I use a Execution Handler
    System.out.println("bbb " + System.currentTimeMillis());
}
public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) {
    System.out.println("aaa " + System.currentTimeMillis());
}

Я обнаружил, что «bbb» выполняется перед «aaa». Если я перехожу в режим отладки и перебираю строку, «aaa» перед «bbb», потому что выполнение кода было замедлено. Неужели я неправильно понял, жду непрерывно?

ожидают эффекта только для текущего потока, но при использовании ExectionHandler или рабочих потоков пула потоков закрытие может выполняться другим потоком, поэтому ожидание бесполезно. Для этого требуется добавить ChannelFutureListener.

1 Ответ

3 голосов
/ 09 декабря 2011

Рабочий поток ввода / вывода сигнализирует о будущем, как только канал закрывается, а затем переходит к обработке обратных вызовов.В этом случае ваш поток пула потоков перепланируется до того, как работник ввода-вывода сможет запустить связанные отключенные, несвязанные и закрытые события.Когда вы запускаете отладчик, вы изменяете способ планирования потоков.

Обычно будущие используются для определения того, когда запрошенная операция завершена, а не для того, чтобы другие операции, которые могут быть вызваны завершением операции, имелитакже завершено.

Для точной логики рассмотрим https://github.com/netty/netty/blob/master/src/main/java/io/netty/channel/socket/nio/NioWorker.java, в частности метод закрытия пустот (канал NioSocketChannel, ChannelFuture future).

...