java同步,异步,阻塞和非阻塞分析

  

<强> java同步,异步,阻塞和非阻塞分析

  

<强>概要:

  

正常情况下,我们的程序以同步非阻塞的方式在运行。但是我们的程序总会出现一些耗时操作,比如复杂的计算(找出1到10个亿之间的素数)和程序本身无法控制的操作(IO操作,网络请求)。包含这些耗时操作的方法我们可以把它称为阻塞方法,包含这些耗时操作的任务我们可以把它称为阻塞任务。阻塞与非阻塞是以是否耗时来定义的。
  

  

如果程序中存在大量阻塞操作,就会影响程序性能。但是阻塞的存在是客观事实,我们的程序是无法改变它的,一个网络请求需要3秒才能响应,我们不可能让它1毫秒就能响应,因为接受请求的服务器可能完全不由我们控制。但是我们可以改变处理阻塞的方式,以异步的方式处理阻塞任务。实现异步的主要技术就是多线程。图示:

  

 java同步,异步,阻塞和非阻塞分析

  

同步和异步是个时序概念。同步就是同时只执行一个任务,而异步则是同时执行多个任务。
  

  

<强>代码示例
  

  

<强>模拟网络请求:
  

              包com.zzj.asyn;      公开课HttpRequest {   私人可调用的调用;      公共HttpRequest(可调用的调用){   这一点。可调用=可调用的;   }      公共空间发送(){//模拟网络请求   尝试{   线程。睡眠(1000 * 5);   }捕捉(InterruptedException e) {   e.printStackTrace ();   .interrupt Thread.currentThread () ();   }//回调   this.callable。调用(“Hello world !”);   }      公共接口调用{   无效电话(字符串的结果);   }   }      之前      

以同步方式处理阻塞任务:
  

        包com.zzj.asyn;      进口com.zzj.asyn.HttpRequest.Callable;/* *   *以同步的方式处理阻塞任务   * @author联想   *   */公共类应用{   公共静态void main (String [] args) {   新HttpRequest(新调用(){   @Override   公共空间调用(字符串结果){   system . out。println(“线程:“+ Thread.currentThread () . getname ());   system . out。println(“从远程服务器消息:”+结果);   }   }).send ();   system . out。println(“线程”+ Thread.currentThread () . getname() +“结束了!”);   }   }   之前      

结果:
  

        线程:主要   从远程服务器消息:Hello world !   线程主要是结束了!   之前      

以异步的方式处理阻塞任务:
  

        包com.zzj.asyn;      进口com.zzj.asyn.HttpRequest.Callable;/* *   *以异步的方式处理阻塞任务   * @author联想   *   */公开课App2 {   公共静态void main (String [] args) {   新线程(新Runnable () {   @Override   公共空间run () {   新HttpRequest(新调用(){   @Override   公共空间调用(字符串结果){   system . out。println(“线程:“+ Thread.currentThread () . getname ());   system . out。println(“从远程服务器消息:”+结果);   }   }).send ();   }   }).start ();   system . out。println(“线程”+ Thread.currentThread () . getname() +“结束了!”);   }   }   之前      

结果:
  

        线程主要是结束了!   线程:Thread-0   从远程服务器消息:Hello world !   之前      

,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

java同步,异步,阻塞和非阻塞分析