栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Java Bio编程

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java Bio编程

IO模型 基本说明
  1. io模型就是数据的发送与接收,这个直接决定了程序之间通信的效率
  2. Java的网络编程常见三种Io分别是:bio,nio,aio
  3. Bio:阻塞并且同步,服务器实现一个连接对应一个线程,如果这个连接阻塞,那么就芭比扣了,别的事都没做了。

Nio:非阻塞并同步,服务器实现多个连接对应一个线程,采用了轮询的方式复用io,如果这个连接阻塞,问题不大,线程还能去做别的事情。

aio:异步非阻塞

BIO BIO工作原理

基本流程

服务端启动一个socket -> 对每一个客户启动一个线程 -> 工作,如果没有响应就会被阻塞。

bio案例

编写一个伪服务器,端口号8888。当有客户端来的时候,启动一个线程去处理。

public class BioDemo {
	public static void main(String[] args) throws Exception{
		ExecutorService executorService = Executors.newCachedThreadPool();
		// ServerSocket
		ServerSocket serverSocket = new ServerSocket(8888);
		System.out.println("------服务器已经启动------");
		while (true){
			// 阻塞式
			System.out.println("------等待客户端连接------");
			Socket socket = serverSocket.accept();
			System.out.println("------已经连接到客户端------");
			System.out.println("------");
			executorService.submit(()->{
				try {
					doSomething(socket);
				} catch (IOException e) {
					e.printStackTrace();
				}finally {
					try {
						socket.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			});
		}
	}
	
	public static void doSomething (Socket socket) throws IOException {
	System.out.println(Thread.currentThread().getName() + "..." + Thread.currentThread().getId());
		byte[] bytes = new byte[1024];
		InputStream inputStream = socket.getInputStream();
		while (true){
			int read = inputStream.read(bytes);
			if(read != -1){
				System.out.println(new String(bytes,0,read));
			}
		}
	}
}

案例中我们发现,每telnet一次,就会新建一个线程。当一个线程暂时没事做,就会堵在哪里。啥也不做。

结果分析

1、每一个客户端都会独立开辟一个线程就行操作。
2、如果请求的客户端多,那么造成的系统资源开销是特别大的。
3、当一个线程暂时没事做,就会堵在哪里,造成线程资源浪费。

结束语

这就是bio我们认识到了,Bio还是挺不讲武德的,你给人家一人建一个,系统资源浪费不说,还占着茅坑不拉*,造成了茅坑的浪费。这很不好,当然了,在人流量小,厕所大的情况下,并没有什么问题。比较咱们人少。随便浪费。

再见再见再见再见。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/973169.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号