JAVA分享篇(4)基础知识大总结
阻塞I/O (Blocking I/O)
就平常所说的I/O,默认情况下所有的socket都是blocking,一个典型的读操作流程大概是:
当用户程序进程请求调用了系统调用,内核就开始了IO的第一个阶段:等待数据准备。
对于network io来说,很多时候数据在一开始还没有到达(比如,还没有收到一个完整的UDP包),这个时候内核就要等待足够的数据到来。而在用户程序进程这边,整个进程会被阻塞。
当内核一直等到数据准备好了,它就会将数据从内核中拷贝到用户程序进程,然后内核返回结果,用户程序进程才解除block的状态,重新运行起来。
所以,blocking IO的特点就是在IO执行的两个阶段都被block了。
非阻塞I/O (Non-Blocking I/O)
简称 NIO,可以通过设置socket使其变为non-blocking。
当对一个non-blocking socket执行读操作时,流程是:
当用户程序进程请求调用了系统调用,系统不会阻塞用户程序进程,而是立刻返回一个ewouldblock错误,从用户进程角度讲 ,并不需要等待,而是马上就得到了一个结果。
用户进程判断标志是ewouldblock时,就知道数据还没准备好,于是它就可以去做其他的事了,于是它可以再次发送recvfrom,一旦内核中的数据准备好了。并且又再次收到了用户进程的系统调用,那么它马上就将数据拷贝到了用户程序,然后返回。
常见创建启动线程两种方式
1、继承方式,自定义线程类继承java.lang.Thread类,然后调用start方法启动线程。
2、实现方式,自定义线程类实现java.lang.Runnable接口,调用Thread的构造方法传入Runnable对象实例线程对象,然后调用线程对象的start方法。
免责声明:部分文章信息来源于网络以及客户意见反馈,本站只负责对文章进行整理、排版、编辑,出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性,如本站文章和转稿涉及版权等问题,请作者在及时联系本站,我们会尽快联系您处理。