您好,登錄后才能下訂單哦!
小編給大家分享一下Netty中線程名稱的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
在這兩個Group內部有很多個NioEventLoop
接下來我們解釋下后面兩個數字如何確定的.
我們就拿nioEventLoop-2-1這個為例
備注: 包括dubbo, RocketMQ這樣的框架在內, 它們底層在使用Netty時的代碼類似, 如下
EventLoopGroup bossGroup = new NioEventLoopGroup(1);EventLoopGroup workerGroup = new NioEventLoopGroup();
我們繼續分析nioEventLoop-2-1中數字1的由來.
備注: 示例nioEventLoop-2-1中的nioEventLoop這個名字是固定的.
實戰
接下來我們從實際去看下它們的名字
服務端代碼如下
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.FixedLengthFrameDecoder;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import io.netty.handler.timeout.IdleStateHandler;
import java.util.concurrent.TimeUnit;
public class Server {
public static void main(String[] args) throws Exception {
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap serverBootstrap = new ServerBootstrap();
try {
serverBootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.handler(new LoggingHandler(LogLevel.INFO))
.childHandler(new ChannelInitializer<NioSocketChannel>() {
@Override
protected void initChannel(NioSocketChannel ch) {
ChannelPipeline channelPipeline = ch.pipeline();
// ...
}
});
// 綁定端口 同步等待成功
ChannelFuture channelFuture1 = serverBootstrap.bind("127.0.0.1", 8080).sync();
// 等待服務端監聽端口關閉
channelFuture1.channel().closeFuture().sync();
} finally {
// 執行到此處說明服務端已經關閉
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
}
我們把上面的代碼啟動, 然后通過telnet 127.0.0.1 8080方式連接服務器. 我們使用JDK自帶的jvisualvm查看線程.
通過telnet連接
我們發現多了兩個線程, 因為我們通過telnet連接了兩次, 所以多了兩個線程. 其中第二個數字一個是-1, 另一個是-2,表示第1個和第2個線程的意思.
但是
根據上面的服務端代碼和前面的講解, 我們明明創建了兩個線程池, 那么第一個數字應該是-1和-2才對, 可是我們實際觀察發現, 卻是-2和-3. (更準確的說, nioEventLoopGroup-2表示bossGroup, nioEventLoopGroup-3表示workerGroup). 我們的代碼明明只是new出來2個NioEventLoopGroup, 現在實際觀察卻發現nioEventLoopGroup-1被別人占了.
我們從源碼中尋找答案
當我們在代碼中通過new實例化NioEventLoopGroup時, 由于NioEventLoopGroup繼承MultithreadEventExecutorGroup, 所以這個MultithreadEventExecutorGroup也會被實例化.
從圖中我們發現, 會實例化一個DefaultPromise, 其中有個GlobalEventExecutor.INSTANCE. 使用單例模式創建GlobalEventExecutor. 其中GlobalEventExecutor有個屬性
final ThreadFactory threadFactory = new DefaultThreadFactory(DefaultThreadFactory.toPoolName(getClass()), false, Thread.NORM_PRIORITY, null);
再跟蹤下DefaultThreadFactory
我們看右下角發現了真相, -1被globalEventExecutor-1-使用了.
備注: DefaultThreadFactory這個工廠類在創建bossGroup和workerGroup都會被使用.
以上是“Netty中線程名稱的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。