Технологии Java

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

Буферы

Содержание

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

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

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

Операции

  • Подготовка к записи clear()
  • Подготовка к чтению flip()
  • Подготовка к повторному чтению 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);
            }
        }
    );
    

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

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

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

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

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

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

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

Содержание

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

  • Поток исполнения
  • Не системный
  • Исполняется в рамках системного
    • Возможно — разных
  • Состав
    • Стек
    • Thread locals

История

  • Java 1.1‒1.3: Green threads
  • Java 19, 20: Preview
  • Java 21: Release

Использование

  • Поток-на-запрос
  • Без пулинга
  • Короткое время жизни

Пример

  • Создание 10000 потоков
    try (
      ExecutorService executor = Executors
          .newVirtualThreadPerTaskExecutor()
    ) {
        IntStream.range(0, 10_000).forEach(i -> {
            executor.submit(() -> {
                Thread.sleep(Duration.ofSeconds(1));
                return i;
            });
        });
    }
    

Ресурсы

  • Реальный поток для исполнения
  • Ничего при ожидании
    • Ввод-вывод, очереди, future
      // +
      response.send(
          future1.get() // ‒
          +                   // +
          future2.get() // ‒
      ); // +
      
  • Препятствия
    • synchronized
    • native

Создание потоков

  • Непосредственное
    • Thread.startVirtualThread(Runnable)
    • thread.isVirtual()
    • daemon, NORM_PRIORITY
  • Thread.Builder
  • Фабрики
    • Thread.ofVirtual()
    • Thread.ofPlatform()

Заключение

Содержание

Ссылки

Вопросы

???