(A)の反応器スレッド網状ソースコード解析

ネッティーはその後、NioEventLoop炉心スレッド、NioEventLoopの広い範囲の使用で対応する項目であることをやってで終わりでいますか?タイムリーな実施と効果的なポーリングタスクのイベントループを確保するために、どのように網状のですか?そして、どのようにNIOのバグJDKのうち、優雅に修正するには?

原子炉スレッド開始

NioEventLoopのrunメソッドは、原子炉のメインスレッドは、タスクを追加するのは初めてで方法NioEventLoop親SingleThreadEventExecutorを実行開始されたされました

@Override
public void execute(Runnable task) {
    ...
    boolean inEventLoop = inEventLoop();
    if (inEventLoop) {
        addTask(task);
    } else {
        startThread();
        addTask(task);
        ...
    }
    ...
}

外部スレッドがstartThread()、ネッティーはスレッドタスクキューを開始し、さらに内部のタスクを追加し、起動しない場合は原子炉のスレッドは、開始されていない判断させていただきます際に内部で実行キューをタスクにタスクを追加します

private void startThread() {
    if (STATE_UPDATER.get(this) == ST_NOT_STARTED) {
        if (STATE_UPDATER.compareAndSet(this, ST_NOT_STARTED, ST_STARTED)) {
            doStartThread();
        }
    }
}

アクチュエータエグゼキュータ内部メソッド呼び出しを実行するの実装でSingleThreadEventExecutor doStartThread、詰め実行可能な実行のスレッドとしてパッケージ化プロセスの実行方法NioEventLoopを呼び出し

private void doStartThread() {
    ...
    executor.execute(new Runnable() {
        @Override
        public void run() {
            thread = Thread.currentThread();
            ...
                SingleThreadEventExecutor.this.run();
            ...
        }
    }
}

エグゼキュータ・スレッドは、対応する網状リアクタースレッドエンティティ、作成されます。デフォルトのエグゼキュータはありThreadPerTaskExecutor

デフォルトによって、ThreadPerTaskExecutorは、実行の実行方法DefaultThreadFactoryを通して毎回FastThreadLocalThreadスレッドを作成し、このスレッドは、反応器のスレッドで網状エンティティであります

ThreadPerTaskExecutor

public void execute(Runnable command) {
    threadFactory.newThread(command).start();
}

そしてコードにより、本明細書では詳細に説明されていない新しいFastThreadLocalThreadに組み合わせThreadPerTaskExecutor DefaultThreadFactoryは、簡単に次の段落で説明される理由について

  • 親クラスMultithreadEventExecutorGroup NioEventLoopGroupにネッティー標準プロシージャ・コール次のコード
protected MultithreadEventExecutorGroup(int nThreads, Executor executor,
                                        EventExecutorChooserFactory chooserFactory, Object... args) {
    if (executor == null) {
        executor = new ThreadPerTaskExecutor(newDefaultThreadFactory());
    }
}
  • NioEventLoopはその後にnewChildによってやり方に渡されます
@Override
protected EventLoop newChild(Executor executor, Object... args) throws Exception {
    return new NioEventLoop(this, executor, (SelectorProvider) args[0],
        ((SelectStrategyFactory) args[1]).newSelectStrategy(), (RejectedExecutionHandler) args[2]);
}

原子炉のスレッドの作成についてと、あまり話をし始め、我々は要約:ネッティースレッドが原子炉内に作成されたタスク、スレッド実体FastThreadLocalThread、NioEventLoopの主な方法として、実行、実行の最後のスレッドを追加します

おすすめ

転載: blog.csdn.net/weixin_34059951/article/details/90929365