首页 > 编程 > Java > 正文

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

2019-11-26 13:06:21
字体:
来源:转载
供稿:网友

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

概要:

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

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

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

代码示例

模拟网络请求:

package com.zzj.asyn;  public class HttpRequest {   private Callable callable;      public HttpRequest(Callable callable) {     this.callable = callable;   }      public void send(){     // 模拟网络请求     try {       Thread.sleep(1000 * 5);     } catch (InterruptedException e) {       e.printStackTrace();       Thread.currentThread().interrupt();     }     // 回调     this.callable.call("Hello world!");   }      public interface Callable{     void call(String result);   } } 

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

package com.zzj.asyn;  import com.zzj.asyn.HttpRequest.Callable;  /**  * 以同步的方式处理阻塞任务  * @author lenovo  *  */ public class App {   public static void main(String[] args) {     new HttpRequest(new Callable() {       @Override       public void call(String result) {         System.out.println("Thread:" + Thread.currentThread().getName());         System.out.println("Message from remote server:" + result);       }     }).send();     System.out.println("Thread " + Thread.currentThread().getName() + " is over!");   } } 

结果:

Thread:main Message from remote server:Hello world! Thread main is over! 

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

package com.zzj.asyn;  import com.zzj.asyn.HttpRequest.Callable;  /**  * 以异步的方式处理阻塞任务  * @author lenovo  *  */ public class App2 {   public static void main(String[] args) {     new Thread(new Runnable() {       @Override       public void run() {         new HttpRequest(new Callable() {           @Override           public void call(String result) {             System.out.println("Thread:" + Thread.currentThread().getName());             System.out.println("Message from remote server:" + result);           }         }).send();       }     }).start();     System.out.println("Thread " + Thread.currentThread().getName() + " is over!");   } } 

结果:

Thread main is over! Thread:Thread-0 Message from remote server:Hello world! 

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表