Thread与并发编程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/admijk/article/details/64444889

Java线程

最近两周一直做前端,做的很烦躁,也就没有心力静下心来思考技术,人比较浮躁,很焦虑。

3周前,老系统出了一次fullgc,我无从查起,于是在ata上搜索相关文章,发现了dump内存,以前虽然简单使用过,但是用起来不顺,于是就理了理。

jps   
jmap出内存snapshot快照,顺便用eclipse的mat工具看了看。   

jstack用例dump线程堆栈。可以排查死锁等问题,也可以查看线程调用堆栈。查看jstack日志,不太懂。
线程状态(有一个状态机)

线程之间数据交互:ThreadLocl
线程之间等待消息:wait()/notify()、notifyAll()
线程之间资源竞争:synchoried/lock

线程的属性:deamod(后台线程)、priority(优先级)、
线程让步:yield()
线程睡眠:sleep()
线程join: jion()

runnable
ThreadLocal
ThreadGroup

callable
ExcuteService

以上是基础,于是又了后来java6/7/8提供的不同的多线程提供的工具。

Tomcat连接器

之前看tomcat的源码时,对连接器比较在意,这让我认识到socket、serverSocket,我以为我理解了网络连接。
我一直心中有个疑惑:socketServer只能监听机器上的一个端口,如何来实现多线程呢?百思不得其解,也就暂时放下了。
今天看了一下i/o的5种模型,又绕回了原来的问题。
终于明白了,bio/nio/aio的区别。
对应代码这边就是Socket s = serverSocket.accept();serverSocket可以保存一个链接队列,accept可以去到一个连接进行处理,socket的输入输出io是阻塞的,一直等着io读取完数据,阻塞一个用户线程。
nio的selector可以管理多个channel,从ChannelServerSocket可以获取SocketChannel,然后注册到selector,然后没有selectionKey就有多种状态:OPEN_ACCEPT,OPEN_READ,判断为OPEN_READ(可读)才去处理
这又引出了reator模式,和他对应的有processor模式(未研究)。

于是打通了net/io/nio/thread的任督二脉。

参考
Tomcat性能调校之连接器模块JIO、APR和NIO
BIO与NIO、AIO的区别(这个容易理解)
Java I/O模型从BIO到NIO和Reactor模式
Reactor模式详解

猜你喜欢

转载自blog.csdn.net/admijk/article/details/64444889
今日推荐