Maison  >  Article  >  Java  >  Synchronisation Java, analyse asynchrone, bloquante et non bloquante

Synchronisation Java, analyse asynchrone, bloquante et non bloquante

高洛峰
高洛峰original
2017-02-11 16:17:391384parcourir

Cet article présente principalement des informations pertinentes sur la synchronisation Java, l'analyse asynchrone, bloquante et non bloquante. Les amis qui en ont besoin peuvent se référer à

synchronisation Java, analyse asynchrone, bloquante et non bloquante<.>

Résumé :

Dans des circonstances normales, notre programme s'exécute de manière synchrone et non bloquante. Cependant, nos programmes comporteront toujours des opérations chronophages, comme des calculs complexes (trouver des nombres premiers entre 1 et 1 milliard) et des opérations que le programme lui-même ne peut pas contrôler (opérations d'E/S, requêtes réseau). Les méthodes qui incluent ces opérations fastidieuses peuvent être appelées méthodes de blocage, et les tâches qui incluent ces opérations chronophages peuvent être appelées tâches de blocage. Le blocage et le non-blocage sont définis selon qu'ils prennent ou non du temps.


S'il y a un grand nombre d'opérations de blocage dans le programme, cela affectera les performances du programme. Mais l'existence d'un blocage est un fait objectif, et notre programme ne peut pas le changer. Une requête réseau met 3 secondes à répondre. Il nous est impossible de la faire répondre en 1 milliseconde, car le serveur qui accepte la requête peut être complètement hors service. de notre contrôle. Mais nous pouvons changer la façon dont nous gérons le blocage : gérer les tâches de blocage de manière asynchrone. La principale technologie pour réaliser l’asynchrone est le multi-threading. Illustration :

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

La synchronisation et l'asynchronisme sont des concepts de timing. La synchronisation signifie exécuter une seule tâche à la fois, tandis que l'asynchrone signifie exécuter plusieurs tâches en même temps.


Exemple de code

Demande de réseau simulée :

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); 
  } 
}

Gérer les tâches bloquantes de manière synchrone :


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!"); 
  } 
}

Résultat :


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

Gérer les tâches bloquantes de manière asynchrone :


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!"); 
  } 
}

Résultat :


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

Merci d'avoir lu, j'espère que cela pourra aider tout le monde, merci pour votre soutien à ce site !

Pour plus d'articles liés à la synchronisation Java, à l'analyse asynchrone, bloquante et non bloquante, veuillez faire attention au site Web PHP chinois !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn