Heim >Java >javaLernprogramm >Java-Synchronisation, asynchrone, blockierende und nicht blockierende Analyse

Java-Synchronisation, asynchrone, blockierende und nicht blockierende Analyse

高洛峰
高洛峰Original
2017-02-11 16:17:391428Durchsuche

In diesem Artikel werden hauptsächlich relevante Informationen zur Java-Synchronisation, zur asynchronen, blockierenden und nicht-blockierenden Analyse vorgestellt. Freunde, die sie benötigen, können sich auf

Java-Synchronisation, asynchrone, blockierende und nicht-blockierende Analyse beziehen

Zusammenfassung:

Unter normalen Umständen läuft unser Programm synchron und nicht blockierend. Allerdings werden unsere Programme immer einige zeitaufwändige Vorgänge haben, wie zum Beispiel komplexe Berechnungen (Finden von Primzahlen zwischen 1 und 1 Milliarde) und Vorgänge, die das Programm selbst nicht kontrollieren kann (IO-Vorgänge, Netzwerkanfragen). Methoden, die diese zeitaufwändigen Vorgänge umfassen, können als Blockierungsmethoden bezeichnet werden, und Aufgaben, die diese zeitaufwändigen Vorgänge umfassen, können als Blockierungsaufgaben bezeichnet werden. Blockieren und Nichtblockieren werden dadurch definiert, ob sie Zeit benötigen.

Wenn das Programm eine große Anzahl blockierender Vorgänge enthält, wirkt sich dies auf die Programmleistung aus. Das Vorhandensein einer Blockierung ist jedoch eine objektive Tatsache, und unser Programm kann dies nicht ändern. Die Antwort auf eine Netzwerkanfrage dauert für uns unmöglich, da der Server, der die Anfrage akzeptiert, möglicherweise vollständig ausgefallen ist unserer Kontrolle. Aber wir können die Art und Weise ändern, wie wir mit Blockierungen umgehen – blockierende Aufgaben asynchron behandeln. Die wichtigste Technologie zur Erzielung von Asynchronität ist Multithreading. Illustration:

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

Synchronisation und Asynchronität sind Timing-Konzepte. Synchronisierung bedeutet, dass nur eine Aufgabe gleichzeitig ausgeführt wird, während asynchron bedeutet, dass mehrere Aufgaben gleichzeitig ausgeführt werden.

Codebeispiel

Simulierte Netzwerkanfrage:

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

Blockierende Aufgaben synchron bearbeiten:

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

Ergebnis:

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

Blockierende Aufgaben asynchron verarbeiten:

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

Ergebnis:

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

Vielen Dank fürs Lesen, ich hoffe, es kann allen helfen, vielen Dank für Ihre Unterstützung dieser Seite!

Weitere Artikel zu Java-Synchronisation, asynchroner, blockierender und nicht blockierender Analyse finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn