标签:
这两天再Netty之家看了李老板的一篇文章,主要涉及了NioEventLoop和守护线程,文章最后提出了一个小问题,如下:
按照代码运行了一下,并通过java visualVM监控线程运行状态,截图如下:
可以发现最终JVM进程在bossGroup中的四个线程全部死掉后自动退出。因为此时的5个用户线程(main线程和nioEventLoopGroup-2中的4个线程)已经全部终止,JVM中只剩下守护线程,所以进程会退出。
思考:假设如果碰巧在bossGroup的四个线程死掉以前来了用户请求,会怎么样呢?实验代码如下:
TimeUnit.SECONDS.sleep(10); ChannelFuture f = b.bind(port).sync(); // 等待服务端监听端口关闭 //f.channel().closeFuture().sync(); } finally { // 优雅退出,释放线程池资源 TimeUnit.SECONDS.sleep(10); //线程休息10秒,假设期间会收到用户请求 bossGroup.shutdownGracefully(); //workerGroup.shutdownGracefully(); }
实验结果如下:
我们会发现如果在所有监听线程终止之前收到了一个用户请求并且启动了一个work线程(nioEventGroup-3-1),那么work线程会一直存在,从而JVM进程也就不会退出。
参考文献:
https://mp.weixin.qq.com/s?__biz=MzAwMDIyNTAzMw==&mid=2651309700&idx=1&sn=bc8fba96ca5d9fc8f98b89a70cfdd085&scene=0#rd
标签:
原文地址:http://www.cnblogs.com/Guoyutian/p/5452327.html