小編給大家分享一下Netty中線程名稱的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供烈山企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站制作、成都做網(wǎng)站、H5場景定制、小程序制作等業(yè)務(wù)。10年已為烈山眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。
在這兩個Group內(nèi)部有很多個NioEventLoop
接下來我們解釋下后面兩個數(shù)字如何確定的.
我們就拿nioEventLoop-2-1這個為例
備注: 包括dubbo, RocketMQ這樣的框架在內(nèi), 它們底層在使用Netty時的代碼類似, 如下
EventLoopGroup bossGroup = new NioEventLoopGroup(1);EventLoopGroup workerGroup = new NioEventLoopGroup();
我們繼續(xù)分析nioEventLoop-2-1中數(shù)字1的由來.
備注: 示例nioEventLoop-2-1中的nioEventLoop這個名字是固定的.
實戰(zhàn)
接下來我們從實際去看下它們的名字
服務(wù)端代碼如下
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
() { @Override
protected void initChannel(NioSocketChannel ch) {
ChannelPipeline channelPipeline = ch.pipeline();
// ...
}
});
// 綁定端口 同步等待成功
ChannelFuture channelFuture1 = serverBootstrap.bind("127.0.0.1", 8080).sync();
// 等待服務(wù)端監(jiān)聽端口關(guān)閉
channelFuture1.channel().closeFuture().sync();
} finally {
// 執(zhí)行到此處說明服務(wù)端已經(jīng)關(guān)閉
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
}
我們把上面的代碼啟動, 然后通過telnet 127.0.0.1 8080方式連接服務(wù)器. 我們使用JDK自帶的jvisualvm查看線程.
通過telnet連接
我們發(fā)現(xiàn)多了兩個線程, 因為我們通過telnet連接了兩次, 所以多了兩個線程. 其中第二個數(shù)字一個是-1, 另一個是-2,表示第1個和第2個線程的意思.
但是
根據(jù)上面的服務(wù)端代碼和前面的講解, 我們明明創(chuàng)建了兩個線程池, 那么第一個數(shù)字應(yīng)該是-1和-2才對, 可是我們實際觀察發(fā)現(xiàn), 卻是-2和-3. (更準(zhǔn)確的說, nioEventLoopGroup-2表示bossGroup, nioEventLoopGroup-3表示workerGroup). 我們的代碼明明只是new出來2個NioEventLoopGroup, 現(xiàn)在實際觀察卻發(fā)現(xiàn)nioEventLoopGroup-1被別人占了.
我們從源碼中尋找答案
當(dāng)我們在代碼中通過new實例化NioEventLoopGroup時, 由于NioEventLoopGroup繼承MultithreadEventExecutorGroup, 所以這個MultithreadEventExecutorGroup也會被實例化.
從圖中我們發(fā)現(xiàn), 會實例化一個DefaultPromise, 其中有個GlobalEventExecutor.INSTANCE. 使用單例模式創(chuàng)建GlobalEventExecutor. 其中GlobalEventExecutor有個屬性
final ThreadFactory threadFactory = new DefaultThreadFactory(DefaultThreadFactory.toPoolName(getClass()), false, Thread.NORM_PRIORITY, null);
再跟蹤下DefaultThreadFactory
我們看右下角發(fā)現(xiàn)了真相, -1被globalEventExecutor-1-使用了.
備注: DefaultThreadFactory這個工廠類在創(chuàng)建bossGroup和workerGroup都會被使用.
以上是“Netty中線程名稱的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!