Maison > Java > javaDidacticiel > le corps du texte

Synchronisation Java, analyse asynchrone, bloquante et non bloquante

高洛峰
Libérer: 2017-02-11 16:17:39
original
1424 Les gens l'ont consulté

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); 
  } 
}
Copier après la connexion

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!"); 
  } 
}
Copier après la connexion

Résultat :


Thread:main 
Message from remote server:Hello world! 
Thread main is over!
Copier après la connexion

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!"); 
  } 
}
Copier après la connexion

Résultat :


Thread main is over! 
Thread:Thread-0 
Message from remote server:Hello world!
Copier après la connexion

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 !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal