• 阻塞/非阻塞/同步/异步方法和多线程的关系?没有任何关系,俩不挨着


    1.阻塞非阻塞异步同步是针对方法说的,是评判一个方法运行状态的。和多线程完全两个级别。

    2.阻塞非阻塞异步同步是针对方法说的,是评判一个方法运行状态的。和多线程完全两个级别。

    3.阻塞非阻塞异步同步是针对方法说的,是评判一个方法运行状态的。和多线程完全两个级别。

    2.多线程只是能用来避免阻塞或者同步方法时的效率低问题

    1.多线程和阻塞及非阻塞一点关系没有。并不是多线程就非阻塞了。
    2.比如socket读取http request数据时,肯定是要多线程读取的,每个连接对应一个线程去读。因为传统的socket的accept(),send()这些方法是阻塞的,程序就会一直等。所以 
    就要开启多线程保证程序能向下运行,但是每个线程内读取request时,线程内又是阻塞的。所以多线程和阻塞非阻塞没关系的。

    3.多线程和非阻塞(异步)的关系?一点关系没有!即使一个线程也可以是非阻塞或者异步运行的

    4.阻塞非阻塞异步同步是针对方法说的,是评判一个方法运行状态的。
    3.所以通常在Java中处理阻塞I/O要用到线程(大量的线程)。代码如下
    try
    {

    ServerSocket ss = new
    ServerSocket(10000);

    System.out.println("server start...");

    while
    (true) {

    Socket s = ss.accept();

    new
    LogicThread(s);//开一个线程来处理请求,这里面调用InputStream.read()读取请求信息

    }

    } catch
    (Exception e) {

    e.printStackTrace();

    }

    }

    }

    4.可以分析创建服务器的每个具体步骤。首先创建ServerSocket,然后接受新的连接请求,在LogicThread中处理请求。
    传统IO方式(阻塞I/O)在调用InputStream.read()/buffer.readLine()方法时是阻塞的,它会一直等到数据到来或缓冲区已满时或超时时才会返回,并且产生了大量String类型 
    垃圾,尽管可以使用StringBuffer优化;同样,在调用ServerSocket.accept()方法时,也会一直阻塞到有客户端连接才会返回,每个客户端连接过来后,服务端都会启动一个线 
    程去处理该客户端的请求。并且多线程处理多个连接。每个线程拥有自己的栈空间并且占用一些 CPU 时间。每个线程遇到外部未准备好的时候,都会阻塞掉。阻塞的结果就是会 
    带来大量的进程上下文切换。且大部分进程上下文切换可能是无意义的。比如假设一个线程监听某一个端口,一天只会有几次请求进来,但是该 cpu 不得不为该线程不断做上下 
    文切换尝试,大部分的切换以阻塞告终。

    5.非阻塞式I/O(NIO):也可以说成“New I/O” 
    核心类: 
    1.Buffer 为所有的原始类型提供 (Buffer) 缓存支持。 
    2.Charset 字符集编码解码解决方案 
    3.Channel 一个新的原始 I/O 抽象,用于读写Buffer类型,通道可以认为是一种连接,可以是到特定设备,程序或者是网络的连接。通道的类等级结构图如下


    10.4.Selector 
    在过去的阻塞I/O中,我们一般知道什么时候可以向stream中读或写,因为方法调用直到stream准备好时返回。但是使用非阻塞通道,我们需要一些方法来知道什zid

  • 相关阅读:
    webpack 中级配置
    webpack4学习笔记
    window搭建go环境
    谈谈你对laravel的契约,容器,服务提供者,facades的理解以及他们的关系是什么
    php开发微信公众号踩坑
    腾讯云搭建git服务器
    linux的常用命令
    egg项目部署
    axios的使用记录以及实现上传图片
    SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known
  • 原文地址:https://www.cnblogs.com/panxuejun/p/6480596.html
Copyright © 2020-2023  润新知