首頁  >  文章  >  Java  >  詳細介紹java 同步、非同步、阻塞和非阻塞圖文程式碼分析

詳細介紹java 同步、非同步、阻塞和非阻塞圖文程式碼分析

黄舟
黄舟原創
2017-03-08 10:50:471727瀏覽

這篇文章主要介紹了java 同步、非同步、阻塞和非阻塞分析的相關資料,需要的朋友可以參考下

##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!
################

以上是詳細介紹java 同步、非同步、阻塞和非阻塞圖文程式碼分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn