1. Die Equals -Methode wird verwendet, um zu vergleichen, ob der Inhalt des Objekts gleich ist (später überschrieben)
2. Die Hashcode -Methode wird nur in Sammlungen verwendet
3. Wenn die Equals -Methode überschrieben wird, wird das Vergleichsobjekt über die überschriebene Equals -Methode verglichen (beurteilen Sie, ob der Inhalt des Objekts gleich ist).
4. Wenn Sie ein Objekt in eine Sammlung einfügen, bestimmen Sie zunächst, ob der HashCode -Wert des zu platzierten Objekts gleich dem HashCode -Wert eines beliebigen Elements in der Sammlung ist. Wenn es nicht gleich ist, legen Sie das Objekt direkt in die Sammlung. Wenn die HashCode -Werte gleich sind, verwenden Sie die Equals -Methode, um festzustellen, ob das zu platzierte Objekt gleich jedem Objekt in der Sammlung ist. Wenn das gleiche Urteil nicht gleich ist, geben Sie das Element direkt in die Sammlung ein, sonst wird es nicht platziert.
5. Die Equals -Methode verwendet, ob die Objektspeicheradressen gleich sind, um festzustellen, ob die Objekte gleich sind.
Da es sich um zwei neue Objekte handelt, sind die Speicheradressen der Objekte nicht gleich, daher sind Stu1.equals (STU2) falsch.
6. Threads A und B müssen beide das Objektschloss erhalten. Unter der Annahme, dass A die Sperre von Objekt O erwirbt, wartet B darauf, dass a die Sperre von O freigesetzt wird. Wenn synchronisiert wird, wird B, wenn A nicht freigegeben wird, darauf wartet, dass er fortgesetzt wird und nicht unterbrochen werden kann. Wenn Reentrantlock verwendet wird, kann B, wenn A nicht veröffentlicht wird, das Warten unterbrechen, nachdem er lange genug gewartet und andere Dinge tun kann.
Reentrantlock erhält auf drei Arten Schlösser:
a) Lock (), wenn das Schloss erworben wird, kehren Sie sofort zurück. Wenn ein anderer Faden das Schloss hält, bleibt der aktuelle Faden in einem ruhenden Zustand, bis das Schloss erworben wird.
b) Trylock (), wenn das Schloss erworben wird, wird sofort wahr zurückgegeben, und wenn ein anderer Thread das Schloss hält, wird es sofort falsch zurückgegeben.
C) Trylock (langfristige Zeiteinheit), wenn das Schloss erworben wird, wird es sofort zurückgegeben. Wenn ein anderer Faden das Schloss hält, wartet er auf die angegebene Zeit des Parameters.
Während des Wartenprozesses gibt es, wenn das Schloss erworben wird, wahr zurück, und wenn das Wartezeitübergang falsch zurückgibt.
d) lockinterruptical: Wenn das Schloss erworben wird, kehren Sie sofort zurück. Wenn das Schloss nicht erworben wird, befindet sich der aktuelle Faden in einem ruhenden Zustand, bis oder gesperrt oder gesperrt wird.
Oder der aktuelle Thread wird von einem anderen Thread unterbrochen
Synchronized wird auf JVM -Ebene implementiert. Synchronisierte Sperre kann nicht nur durch einige Überwachungstools überwacht werden, sondern auch Ausnahmen können während der Codeausführung auftreten.
Das JVM löst das Schloss automatisch frei, aber es ist nicht möglich, die Sperre zu verwenden. Lock wird über Code implementiert. Um sicherzustellen, dass das Schloss veröffentlicht wird, muss Unlock () endlich {} platziert werden
Wenn der Ressourcenwettbewerb nicht sehr heftig ist, ist die Leistung von synchronisiert besser als die von Reetrantlock. Wenn der Ressourcenwettbewerb jedoch sehr heftig ist, nimmt die Leistung von synchronisiert um Dutzende Male ab, aber die Leistung von Reetrantlock kann normal bleiben.
In der JDK werden die folgenden Klassen hauptsächlich zur Implementierung des Java -Reflexionsmechanismus verwendet, der sich alle im Paket von Java.lang.reflect befindet:
Klasse: repräsentiert eine Klasse.
Feldklasse: Eine Mitgliedsvariable, die eine Klasse darstellt (Mitgliedsvariablen werden auch als Attribute einer Klasse bezeichnet).
Methodenklasse: Eine Methode, die die Klasse darstellt.
Konstruktorklasse: Repräsentiert die Konstruktormethode der Klasse.
Array -Klasse: Bietet statische Methoden zum dynamischen Erstellen von Arrays und zum Zugriff auf Elemente des Arrays.
Hier sind einige Beispiele, um die tatsächliche Anwendung der Reflexions -API anzuzeigen:
1. Erhalten
Die GetClass () -Methode ist in der Klasse java.lang.object definiert. Für jedes Java -Objekt kann der Objekttyp mit dieser Methode erhalten werden. Die Klassenklasse ist eine Kernklasse in der Reflexions -API und hat die folgenden Methoden
GetName (): Holen Sie sich den vollständigen Namen der Klasse.
GetFields (): Holen Sie sich das Eigentum des öffentlichen Typs der Klasse.
getDeclaredfields (): Holen Sie sich alle Eigenschaften der Klasse.
getMethods (): eine Methode, um den öffentlichen Typ der Klasse zu erhalten.
getDeclaredMethods (): Holen Sie sich alle Methoden der Klasse.
GetMethod (String -Name, Klasse [] ParameterTypes): Erhält eine spezifische Methode der Klasse, der Name des Namens gibt den Namen der Methode an, Parametertypes -Parameter gibt den Parameter -Typ der Methode an.
GetConstructors (): Holen Sie sich den Konstruktor der öffentlichen Klasse.
GetConstructor (Klasse [] Parameterypes): Holen Sie sich den spezifischen Konstruktor der Klasse. Der Parameter Parametertypes gibt den Parametertyp des Konstruktors an.
NewInstance (): Erstellen Sie ein Objekt dieser Klasse durch den Konstruktor der Klasse ohne Parameter.
Schritte zum Schreiben eines Java -Reflektors:
1) Sie müssen zuerst das Klassenobjekt einer Klasse erhalten
Zum Beispiel:
Klasse c1 = test.class; Klasse c2 = class.Forname ("com.reflection.test"); Klasse C3 = neuer Test (). GetClass (); 2) Rufen Sie dann die Methoden im Klassenobjekt getrennt auf, um die Eigenschaften/Methoden/Konstruktoren einer Klasse zu erhalten
Hinweis: Wenn Sie normalerweise Methoden/Eigenschaften/Konstruktoren in der Klasse erhalten möchten, sollten Sie sich auf die folgenden Reflexionsklassen konzentrieren
Feld
Konstruktor
Verfahren
<Servlet-Mapping> <Servlet-name> </Servlet-name> <url-pattern> </url-pattern> </servlet-mapping> für (string elementa: str) {system.out.print (elementa + ""); } List <string> list = new ArrayList <string> (); für (int i = 0; i <Str.Length; i ++) {if (! list.contains (str [i])) {list.add (str [i]); }} Set <string> set = new Hashset <string> (); für (int i = 0; i <Str.Length; i ++) {set.add (str [i]); }Die Frühling hat sechs Transaktionen und fünf Isolationsniveaus
Kategorie 1: Inte kurz int lang
Kategorie 2: Double Float
Die dritte Kategorie: logischer Boolescher (sie hat nur zwei Werte, die als wahres Falsch angesehen werden können)
Kategorie 4: Charakter -Char
Methoden in der endgültigen Modifikationsklasse
Funktion: Es kann vererbt werden, kann aber nach Erbschaft nicht neu geschrieben werden.
Endgültige Modifikationsklasse
Funktion: Klassen können nicht vererbt werden.
Wenn der Grundtyp endgültig geändert wird, bleibt der Wert unverändert. Der Referenztyp gibt an, dass die Adresse unverändert bleibt. Das heißt, wenn neu die Adresse kann nicht neu zugewiesen werden.
Sie kennen das endgültige Änderungsattribut
Vorbereitungen sind vorkompiliert. Senden Sie zuerst die SQL zur Vorverarbeitung in die Datenbank und setzen Sie sie dann in den Cache ein. Wenn Sie das nächste Mal feststellen, dass es dasselbe gibt, müssen Sie es nicht kompilieren. Die Ausführungseffizienz ist hoch, es gibt Syntaxanforderungen, um die Überprüfung zu erleichtern, und die Parameter sind dynamisch, wodurch die SQL
Wählen Sie * aus tbname = 'zck' und passwd = 'oder' 1 '=' 1 ';
Die Anweisung ist nicht vorkompiliert und erfordert manuelle Überprüfung auf Syntaxfehler, was hartnäckig ist
HashMap ermöglicht Null als Schlüssel oder Wert eines Eintrags, während Hashtable dies nicht tut
Methode setzen
HashMap führt eine spezielle Verarbeitung auf dem Null -Wert -Schlüssel durch und steckt sie immer in die Tabelle [0]. Wenn Sie den Prozess setzen, wird zuerst der Hash berechnet und dann den Indexwert durch Hash und Tabelle.Length berechnet und dann den Schlüssel in die Tabelle [Index] -Position einfügen. Wenn in Tabelle [Index] bereits andere Elemente vorhanden sind, wird in der Tabelle [Index] eine verknüpfte Liste gebildet, und die neu hinzugefügten Elemente werden in Tabelle [Index] platziert, und die ursprünglichen Elemente werden über den nächsten Eintrag verknüpft. Auf diese Weise wird das Hash -Konfliktproblem in Form einer verknüpften Liste gelöst. Wenn die Anzahl der Elemente den kritischen Wert (capactiy*faktor) erreicht, wird die Kapazität erweitert und die Länge des Tabellenarrays wird die Tabelle.
Methode erhalten
In ähnlicher Weise wird die spezielle Verarbeitung durch die NULL durchgeführt, und das Element mit Schlüssel ist Null in der verknüpften Liste der Tabellen [0].
Der Prozess von GET besteht darin, zuerst den Hash zu berechnen und dann den Indexwert durch Hash und Tabelle zu berechnen, und dann die verknüpfte Liste in der Tabelle [Index] durchzusetzen, bis der Schlüssel gefunden wird, und dann die zugrunde liegende Implementierung von HashMap und Hashtable sowohl Array + verknüpfte Listenstruktur -Implementierungen zu berechnen. Der Index, der das Index des Tabellenarrays ist, wird basierend auf Hash und Tabelle berechnet. Length wird berechnet und der entsprechende Vorgang wird durchgeführt.
Die meisten Indizes basieren auf B-Tree
Die Sicherheitsprobleme von Servlet -Threads werden hauptsächlich durch Instanzvariablen verursacht, sodass Instanzvariablen in Servlets vermieden werden sollten.
Wenn Anwendungsdesign nicht vermeiden kann, Instanzvariablen zu verwenden, wird die Synchronisation verwendet, um die zu verwendenden Instanzvariablen zu schützen. Für eine optimale Systemleistung sollte der Codepfad jedoch synchronisiert werden.
Schreiben Sie ein Singleton -Muster
public static long rekursiv (int n) {if (n <= 0) return 0; if (n == 1) return 1; return rekursiv (n - 1) + rekursiv (n - 2);} public static long Loop (int n) {if (n <= 0) return 0; if (n == 1) return 1; i ++) {sum = fib1+fib2; fib1 = fib2; fib2 = sum;} return sum;} Hashtable ist eine Thread-Safe-Klasse. Es wird synchronisiert, um die gesamte Hash-Tabelle zu sperren, um die Gewindesicherheit zu erzielen, dh die gesamte Tabelle jedes Mal sperren und den Faden besetzen. Mit Concurrenthashmap können mehrere Modifikationsvorgänge gleichzeitig durchgeführt werden, und der Schlüssel ist die Verwendung der Sperrenabteilungstechnologie. Es verwendet mehrere Sperren, um Modifikationen an verschiedenen Teilen der Hash -Tabelle zu steuern.
Concurrenthashmap verwendet Segmente (Segment), um diese verschiedenen Teile darzustellen. Jedes Segment ist eigentlich ein kleiner Hashtable und sie haben ihre eigenen Schlösser. Solange in verschiedenen Segmenten mehrere Modifikationsvorgänge auftreten, können sie gleichzeitig durchgeführt werden.
Einige Methoden müssen Segmente wie Size () überqueren und containsValue (). Möglicherweise müssen sie die gesamte Tabelle anstelle eines bestimmten Segments sperren. Dies erfordert, dass alle Segmente nacheinander sperren. Nach Abschluss des Betriebs werden die Schlösser aller Segmente nacheinander freigegeben. "In Ordnung" ist hier sehr wichtig, sonst besteht eine hohe Möglichkeit der Deadlock. In Concurrenthashmap ist das Segmentarray endgültig und seine Mitgliedsvariablen sind tatsächlich endgültig. Wenn Sie das Array einfach als das endgültige Deklary nicht deklarieren, garantiert es jedoch nicht, dass die Array -Mitglieder endgültig sind, was Umsetzungsgarantien erfordert.
Dies stellt sicher, dass es keine Deadlock gibt, da die Reihenfolge, in der die Schlösser erhalten werden, festgelegt ist
① ThreadLocal ② Synchronized () ③ Wait () und benachrichtigen () ④ flüchtig
ThreadLocal
ThreadLocal stellt sicher, dass unterschiedliche Threads unterschiedliche Instanzen haben und der gleiche Thread dieselbe Instanz haben muss, dh jeder Thread bietet eine Kopie des Wertes der Variablen. Jeder Thread kann seine eigene Kopie unabhängig ändern, anstatt mit der Kopie anderer Threads zu stehen.
Vorteile: Bietet thread-sichere gemeinsam genutzte Objekte
Der Unterschied zu anderen Synchronisationsmechanismen: Der Synchronisationsmechanismus besteht darin, den gleichzeitigen Zugriff auf dieselbe Ressource durch mehrere Threads zu synchronisieren und zwischen mehreren Threads zu kommunizieren.
ThreadLocal ist eine Datenaustausch, die aus mehreren Threads isoliert ist und im Grunde keine Ressourcen zwischen mehreren Threads freigibt. Dies erfordert sicherlich nicht mehrere Threads, die synchronisiert werden müssen.
flüchtig
Die variable volatile modifizierte Mitgliedsvariable ist gezwungen, den Wert der Mitgliedsvariable bei jedem Zugriff auf einen Thread aus dem gemeinsamen Speicher erneut zu lesen. Und,
Wenn sich die Mitgliedsvariable ändert, ist der Thread gezwungen, den Änderungswert wieder in den gemeinsam genutzten Speicher zu schreiben.
Vorteile: Auf diese Weise sehen zwei verschiedene Threads zu jedem Zeitpunkt immer den gleichen Wert einer bestimmten Mitgliedsvariablen.
Grund: Die Java -Sprachspezifikation besagt, dass Threads, um die beste Geschwindigkeit zu erhalten, private Kopien von freigegebenen Mitgliedsvariablen speichern dürfen.
Und es wird nur mit dem ursprünglichen Wert der gemeinsam genutzten Elementvariablen verglichen, wenn der Thread den synchronen Codeblock eingeht oder verlässt.
Auf diese Weise müssen mehrere Threads gleichzeitig mit einem Objekt interagieren, es müssen darauf geachtet werden, dass der Thread Änderungen in freigegebenen Elementvariablen rechtzeitig erhalten.
Das volatile Schlüsselwort fordert die VM auf: Für diese Mitgliedsvariable kann es seine private Kopie nicht speichern, sollte jedoch direkt mit der freigegebenen Mitgliedsvariable interagieren.
Nutzungstipps: Verwenden Sie volatile für Mitgliedervariablen, auf die zwei oder mehr Fäden zugegriffen werden.
Es ist nicht erforderlich, zu verwenden, wenn die zugegriffene Variable bereits im synchronisierten Codeblock oder eine Konstante ist.
Um die Effizienz zu verbessern, kopiert ein Thread eine Mitgliedsvariable (z. B. a) (wie b), und der Zugriff auf A im Thread greift tatsächlich auf B zu. Flüchtige wird verwendet, um diese Situation zu vermeiden.
Volatile teilt JVM mit, dass die von es geänderten Variablen keine Kopien behalten und direkt auf die im Hauptspeicher zugreifen (es ist besser zu verwenden, wenn viele Lesevorgänge vorhanden sind; Kommunikation ist zwischen Threads erforderlich, aber dieser Artikel kann es nicht tun).
Volatile Variablen haben synchronisierte Sichtbarkeitseigenschaften, haben jedoch keine atomaren Eigenschaften.
Dies bedeutet, dass der Thread automatisch den neuesten Wert der volatilen Variablen ermitteln kann. Volatile Variablen können verwendet werden, um die Gewindesicherheit zu gewährleisten, aber nur auf einen sehr begrenzten Satz von Anwendungsfällen angewendet werden: Es besteht keine Einschränkung zwischen mehreren Variablen oder zwischen dem aktuellen Wert einer Variablen und dem geänderten Wert.
Sie können die volatile Variable nur in begrenzten Fällen anstelle von Sperren verwenden. Um die variable ideale Gewindesicherheit zu ermöglichen, müssen die folgenden zwei Bedingungen gleichzeitig erfüllt werden:
Schreibvorgänge in Variablen hängen nicht vom aktuellen Wert ab. Die Variable ist nicht im Invarianten mit anderen Variablen enthalten.
Sleep () gegen Wait ()
Der Schlaf ist eine Thread -Klasse (Thread), die dazu führt, dass dieser Thread die Ausführung für eine bestimmte Zeit pausiert und die Ausführungsmöglichkeit an andere Threads sendet. Der Überwachungsstatus bleibt jedoch bestehen und wird danach automatisch fortgesetzt. Wenn Sie den Schlaf anrufen, wird das Objektschloss nicht freigegeben.
Warten ist eine Methode der Objektklasse. Wenn Sie die Warteverfahren auf diesem Objekt aufrufen, gibt der Thread die Objektschloss auf und gägt den Warteschleusenpool auf, der auf dieses Objekt wartet. Erst nach der Ausgabe einer Benachrichtigungsmethode (oder der Benachrichtigung) für dieses Objekt tritt dieser Thread in den Objektsperrpool ein und bereitet sich darauf vor, die Objektschloss zu erhalten und in den laufenden Status zu gelangen. (Wenn die Variable als volatil deklariert wird, stimmt sie bei jedem Zugriff mit dem Hauptspeicher überein. Wenn auf die Variable in einer synchronen Methode oder in einer synchronen Block zugegriffen wird, wird die Variable synchronisiert, wenn das Schloss am Eingang der Methode oder des Blocks erhalten wird, und das Schloss wird freigegeben, wenn die Methode oder Block -Ausgänge oder Blockabwinkel.)
http://www.yjbys.com/news/202750.html
Das Client -Programm muss zunächst eine bestimmte Containerrolle erzielen und dann eine bestimmte Iteratorrolle durch die spezifische Containerrolle erzielen.
Iterator it = new ArrayList.Iderator ();
1) Greifen Sie auf den Inhalt eines Containerobjekts zu, ohne seine interne Darstellung freizulegen.
2) Unterstützen Sie mehrere Traverals von Containerobjekten.
3) Geben Sie eine einheitliche Grenzfläche (polymorphe Iteration) zur Durchführung verschiedener Behälterstrukturen an.
Verwenden Sie das neue Schlüsselwort} → Der Konstruktor wurde aufgerufen
Verwenden Sie die Newinstance -Methode der Klasse Klasse} → Der Konstruktor wurde aufgerufen
Verwenden Sie die Newinstance -Methode der Konstruktorklasse} → Die Konstruktorfunktion wurde aufgerufen
Verwenden der Klonmethode} → Kein Konstruktor wird aufgerufen
Verwenden der Deserialisierung} → Kein Konstruktor wird aufgerufen
Mitarbeiter EMP2 = (Mitarbeiter) Klasse.ForName ("com.Amployee"). NewInstance (); oder
Employee EMP2 = Mitarbeiter.Class.Newinstance (); Konstruktorkonstruktor = Mitarbeiter.Class.getConstructor (); Mitarbeiter emp3 = constructor.newinstance ();
Mit der Klonmethode müssen wir zunächst die klonbare Schnittstelle implementieren und die von ihr definierte Klonmethode implementieren
Mitarbeiter EMP4 = (Mitarbeiter) EMP3.Clone ();
Wenn das Programm startet, lädt es nicht alle Klassendateien, die vom Programm gleichzeitig verwendet werden sollen. Stattdessen wird eine bestimmte Klassendatei dynamisch über den Java -Klasse -Lademechanismus (Classloader) entsprechend den Anforderungen des Programms in den Speicher geladen. Daher kann sie erst nach dem Laden der Klassendatei in den Speicher von anderen Klassen verwiesen werden. Daher wird Classloader verwendet, um Klassendateien dynamisch in den Speicher zu laden.
Bootstrap Classloader: wird als Start-Class-Loader bezeichnet, es ist der loderne Lader der Java-Klasse in der Ladehierarchie auf der obersten Ebene für das Laden von Kernklassenbibliotheken in der JDK, wie z. Java_home/jre/lib/ext/standardmäßig.
App Classloader: wird als Systemklassenlader bezeichnet, das für das Laden aller Gläser und Klassendateien im Anwendungsklassenpath -Verzeichnis verantwortlich ist.
Da dies wiederholtes Laden vermeiden kann, muss der Vater, wenn der Vater die Klasse geladen hat, nicht erforderlich, dass der Unterrichtsloader sie erneut lädt.
Stellen wir uns vor, wenn wir diesen Delegiertenmodus nicht verwenden, können wir die in der Java -Core -API definierten Typen jederzeit dynamisch ersetzen, was ein sehr großes Sicherheitsrisiko darstellt. Die übergeordnete Delegate-Methode kann diese Situation vermeiden, da die Zeichenfolge bereits vom Start-Klassen-Loader (BootStrcp-Klassenloader) beim Start geladen wird. Daher kann der benutzerdefinierte Classloader niemals eine von selbst geschriebene Zeichenfolge laden, es sei denn, Sie ändern den Standard-Algorithmus der Klassenlader-Suchklasse in JDK.
1. In der Anfrage der Anforderungsobjekt -Client enthält diese Anfrage Parameter aus der Get/Post -Anfrage und kann nur die Bedürfnisse des Kunden verstehen und dann antworten.
2. Relevante Informationen zum Antwortobjekt reagieren auf Kundenanfragen
3. Das Sitzungsobjekt bezieht sich auf eine Sitzung zwischen dem Client und dem Server, beginnend mit einer Webapplikation vom Client zum Server, bis der Client vom Server getrennt ist.
4. Das Out -Objekt ist eine Instanz der JSPWriter -Klasse und ein häufig verwendetes Objekt, um den Inhalt des Clients auszugeben.
5. Das Seitenobjekt zeigt auf die aktuelle JSP -Seite selbst, die ein bisschen wie dieser Zeiger in der Klasse ist. Es ist eine Instanz der Klasse java.lang.object
6. Das Anwendungsobjekt erkennt die Freigabe von Daten zwischen Benutzern und kann globale Variablen speichern. Es beginnt mit dem Serverstart, bis der Server abgeschaltet wird
7. Ausnahmeobjekt ist ein Ausnahmeobjekt. Wenn während des laufenden Prozesses eine Ausnahme auftritt, wird dieses Objekt generiert.
8. PageContext -Objekt bietet Zugriff auf alle Objekte und Namespaces auf der JSP -Seite
9. Das Konfigurationsobjekt wird von der JSP -Engine verwendet, um Informationen daran zu übergeben, wenn ein Servlet initialisiert wird.
JS hat eine Funktion isnan (val) // Wenn es sich um eine Nummer handelt, gibt es falsche zurück
Es gibt XMLDOM -Parsen, Sax
XMLDOM: (xmldocumentObjectModel) Die Leistung verschlechtert sich bei der Verarbeitung großer Dateien stark. Dieses Problem wird durch die DOM -Baumstruktur verursacht, die viel Speicher einnimmt, und das DOM muss das gesamte Dokument in Speicher laden, bevor die Datei analysiert wird, die für den zufälligen Zugriff auf XML geeignet ist.
SAX: (SimpleApiforxML) Im Gegensatz zu DOM ist SAX eine ereignisgesteuerte XML-Parsing-Methode. Es liest XML -Dateien nacheinander und erfordert nicht, dass die gesamte Datei gleichzeitig geladen wird. Wenn Sie auf ein Ereignis wie den Beginn einer Datei, das Ende eines Dokuments oder den Beginn eines Tags und das Ende eines Tags stoßen, löst es ein Ereignis aus, bei dem der Benutzer die XML -Datei verarbeitet, indem er den Verarbeitungscode in seinem Rückrufereignis geschrieben hat, das für den sequentiellen Zugriff auf XML geeignet ist.
STAX: Der Unterschied zwischen (StreamingAPiForxML) und anderen Methoden besteht darin, dass Anwendungen XML als Ereignisstrom verarbeiten können, was in Bezug auf Leistung und Verfügbarkeit besser als andere Methoden ist.
thread.getState ()
Die oben genannten sind die vom Herausgeber für Sie zusammengestellten Java -Interviewfragen. Ich hoffe, sie werden Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht. Der Herausgeber wird Ihnen rechtzeitig antworten!