Технологии Java

Неблокирующий и асинхронный ввод-вывод

Буферы

Содержание

Что такое буфер

  • Последовательность элементов
    • Примитивного типа
  • Класс Buffer

Чтение и запись

Подготовка (1)

Подготовка (2)

  • К повторному чтению rewind()

Операции c пометками

  • Возврат к пометке reset()

Типизированные буферы

Байтовый буфер

Буферы на массиве

Непосредственные буферы

Каналы

Содержание

Канал

  • Открытое соединение с ресурсом
  • Интерфейс Channel
  • Бывает открытым и закрытым

Файловые каналы

Содержание

Иерархия файловых каналов

Каналы ввода/вывода байт

Каналы массового ввода/вывода

Управляемый канал

Прерываемый канал

Файловые каналы

Операции

Отображение в память

Файловые блокировки

Сетевые каналы и неблокирующий ввод-вывод

Содержание

Иерархия сетевых каналов

Сетевые каналы

Сетевые настройки

Селекторы

Работа с селектором

Неблокирующий ввод-вывод

Доступные операции

Селекторы

Готовые действия

Пример 1

  • while (!Thread.interrupted()) {
        selector.select();
        for (final Iterator<SelectionKey> i =
                selector.selectedKeys().iterator(); i.hasNext(); ) {
            final SelectionKey key = i.next();
            try {
                if (key.isAcceptable()) {
                    final ServerSocketChannel serverChannel =
                        (ServerSocketChannel) key.channel();
                    handle(serverChannel.accept());
                }
            } finally {
                i.remove();
            }
        }
    }
    

Пример 2

  • while (!Thread.interrupted()) {
        selector.select(key -> {
            try {
                if (key.isAcceptable()) {
                    final ServerSocketChannel serverChannel =
                        (ServerSocketChannel) key.channel();
                    handle(serverChannel.accept());
                }
            } catch (final IOException e) {
                throw new UncheckedIOException(e);
            }
        });
    }
    

Каналы сокетов

Иерархия каналов (3)

Датаграммные каналы

Пайпы

Асинхронные каналы

Содержание

Иерархия асинхронных каналов

Асинхронный ввод/вывод

Обработка результата

Пример

  • socketChannel.read(
        buffer,
        context,
        new CompletionHandler<Integer, Context>() {
            public void completed(Integer result, Context context) {
                if (context.process(result)) {
                    socketChannel.read(buffer, this);
                }
            }
            public void failed(Throwable e, Context context) {
                context.error(e);
            }
        }
    );
    

Асинхронный байтовый канал

Асинхронный сокетный канал

Асинхронный серверный канал

Асинхронный файловый канал

Группы асинхронных каналов

Прочее

Содержание

Конвертация в/из потоков

Виртуальные потоки

  • Освобождаются при вводе-выводе
  • Дешёвые
    • Можно создавать на каждый запрос
    • Надо контролировать число/память

Заключение

Содержание

Ссылки

Вопросы

???