年轻人此时不破何时破
java调试相比于c++简单的多了,几个技巧,打印当前java进程里面启动了几个线程
代码
ThreadMXBean mxBean = ManagementFactory.getThreadMXBean();
ThreadInfo[] allThreads = mxBean.dumpAllThreads(false, false);
for (ThreadInfo threadInfo : allThreads) {
System.out.println(threadInfo.getThreadId()+"==="+threadInfo.getThreadName());
}
dubbo的例子:
31===DubboSaveRegistryCache-thread-1
30===Curator-Framework-0
29===main-EventThread
28===main-SendThread(localhost:2181)
27===Curator-ConnectionStateManager-0
25===NettyServerBoss-4-1
23===qos-boss-1-1
22===ObjectCleanerThread
21===ZookeeperDynamicConfiguration-thread-1
20===Curator-TreeCache-0
19===Curator-Framework-0
18===main-EventThread
17===main-SendThread(localhost:2181)
16===Curator-ConnectionStateManager-0
8===JDWP Command Reader
7===JDWP Event Helper Thread
6===JDWP Transport Listener: dt_socket
5===Attach Listener
4===Signal Dispatcher
3===Finalizer
2===Reference Handler
1===main
可以通过这些启动的线程,大致猜测该项目的架构形态,当然只是一个很模糊的形态,具体的还得输入代码
比如:25===NettyServerBoss-4-1
我们大约猜到dubbo的底层的网络模型是netty,看源码果然如此。
看过zk源码的同学的应该知道zk的网络模型也有netty的实现
当然还有很多再比如现在比较流行的谷歌的grpc调用,其实其java中Android中client,有两种实现
一种是okhttp-client,另一种就是netty版本,基本是为了更好的实现http2.0一些协议。
不管怎么说,可见netty在java网络编程中的重要程度,java消息中间件不会netty,那你还算个啥。
所以学netty吧