zoukankan      html  css  js  c++  java
  • 阻塞/非阻塞/同步/异步方法和多线程的关系?没有任何关系,俩不挨着

    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

  • 相关阅读:
    矩阵构造方法(转载)
    欧拉函数
    POJ3233:Matrix Power Series(矩阵快速幂+二分)
    矩阵快速幂(转载)
    素数筛法模板
    快速幂取模算法
    hdu1286(找新朋友)&&POJ2407Relatives(欧拉函数模版题)
    判断两线段相交
    POJ3070:Fibonacci(矩阵快速幂模板题)
    HDU1575:Tr A(矩阵快速幂模板题)
  • 原文地址:https://www.cnblogs.com/panxuejun/p/6480596.html
Copyright © 2011-2022 走看看