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:
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!
Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in die Java-Synchronisation, asynchrone, blockierende und nicht blockierende grafische Codeanalyse. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!