Skip to content

Part VI: ノンブロッキング I/O

概要

本章では、Java NIO を使用したノンブロッキング I/O を学びます。


ブロッキング vs ノンブロッキング

ブロッキング I/O

// スレッドは I/O 完了まで待機
val socket = new Socket("localhost", 8080)
val input = socket.getInputStream
val data = input.read() // ブロック

ノンブロッキング I/O

import java.nio.channels._
import java.nio.ByteBuffer

val channel = SocketChannel.open()
channel.configureBlocking(false)
channel.connect(new InetSocketAddress("localhost", 8080))

// 接続が完了していなければすぐに戻る
while !channel.finishConnect() do
  // 他の作業ができる

Selector パターン

import java.nio.channels.{Selector, SelectionKey}

val selector = Selector.open()
channel.register(selector, SelectionKey.OP_READ)

// イベントを待機
while true do
  selector.select() // ブロック(イベントがあるまで)

  val keys = selector.selectedKeys().iterator()
  while keys.hasNext do
    val key = keys.next()
    keys.remove()

    if key.isReadable then
      // 読み取り処理
      handleRead(key)

メリット

項目 ブロッキング ノンブロッキング
スレッド数 接続数に比例 少数で対応可能
メモリ 多い 少ない
複雑さ 低い 高い

次のステップ

Part VII では、Scala の Future を使った非同期プログラミングを学びます。