1

私は NioWorker.run() メソッドを調べて、その仕組みを理解しようとしています。以下は、コードの簡略化されたバージョンです。

    for(;;) {           
      try {
        SelectorUtil.select(selector);

        if (wakenUp.get()) {
          selector.wakeup();
        }

        cancelledKeys = 0;
        processRegisterTaskQueue();
        processWriteTaskQueue();
        processSelectedKeys(selector.selectedKeys());

      } catch (Throwable t) {
      }
    }

それが何をするのかは明らかではありませんが、いくつか質問があります。

1. Selector.select(selector) は、500 ミリ秒のタイムアウトで選択を実行します。単なるブロッキングコールではないのはなぜですか?

2.以下のフラグメントの目的は何ですか? なぜウェイクアップを実行する必要があるのですか?

    if (wakenUp.get()) {
       selector.wakeup();
    }

前もって感謝します

4

1 に答える 1

2
  1. processRegisterTaskQueue() メソッドを介してワーカーへの新しいチャネルの登録も処理するため、時間ベースのブロッキング Selector.select(..) 呼び出しを使用します。時間ベースの呼び出しを使用しないと、処理が遅くなるリスクがあります。最近のバージョンでは、Selector.select(..) 呼び出しを 10 ミリ秒を使用するように変更しました。

  2. [1] のコメントを参照してください。

[1] https://github.com/netty/netty/blob/3/src/main/java/org/jboss/netty/channel/socket/nio/AbstractNioWorker.java#L202

于 2012-04-17T19:12:55.067 に答える