Unterschied: Die permanente Generierung wurde in jdk1.8 abgebrochen und durch Metaspace ersetzt. Dieser Speicherplatz belegt nicht den Speicher der virtuellen JVM-Maschine, sondern der Speicher der physischen Maschine Schnittstellen für funktionale Ausdrücke und andere Funktionen.
Vergleich zwischen jdk1.7 und jdk1.8
1. jdk1.7-Syntax
1) Sie können Binärzahlen verwenden, um ganze Zahlen darzustellen, beginnend mit 0b.
2) Die Switch-Anweisung unterstützt den String-Typ
3) Der Try-Block kann manuell ohne „finally“ geschlossen werden, er kann direkt im Try-Block geschlossen werden
4) Mehrere Ausnahmen abfangen Hinweis: Der Catch-Ausnahmetyp ist final kann nicht geändert werden. Diese Funktion generiert weniger Bytecode und reduziert die Coderedundanz. Behalten Sie den Ausnahmetyp bei, wenn Sie die Ausnahme erneut auslösen.
5) Sie können Unterstriche in Zahlen verwenden, was freundlicher ist. Beachten Sie jedoch die Regeln zum Hinzufügen von Unterstreichungen nur zwischen Zahlen. Unterstreichungen dürfen nicht am Anfang oder Ende von Zahlen verwendet werden.
6) Beim Erstellen einer generischen Instanz wird der generische Typ der Instanz automatisch basierend auf dem generischen Typ abgeleitet, wenn die Variable deklariert wird.
7) Übergeben Sie nicht verdinglichte Parameter in Methoden mit variablen Parametern, um Kompilierungswarnungen und -fehler zu verbessern.
8) Informativeres Backtracking.
2. Einige neue Funktionen von NIO2
1) Implementieren Sie asynchrone, nicht blockierende E/A- und Proactor-Funktionen.
2) Rekursive Suche im Dateibaum und Dateierweiterungssuche try-with-resources schließt automatisch die Ressourcenobjekte Connection, ResultSet und Statement.
2) RowSet1.1 (Schnittstellenmodell): Durch die Einführung der RowSetFactory-Schnittstelle und der RowSetProvider-Klasse können Sie verschiedene vom JDBC-Treiber unterstützte Zeilensätze erstellen. Die Rowset-Implementierung dient hier tatsächlich dazu, einige Operationen in der SQL-Anweisung in Methodenoperationen umzuwandeln. Kapselung einiger Funktionen. 3) Der JDBC-ODBC-Treiber wird in jdk8 gelöscht.
4. Verbesserungen des Parallelitätstools1) Fork-Join, das Fork/Join-Framework ist ein von Java7 bereitgestelltes Framework zum parallelen Ausführen von Aufgaben. Es ist ein Framework, das große Aufgaben in mehrere kleine Aufgaben aufteilt und schließlich zusammenfasst Jede Aufgabe ist ein Rahmen, um die Ergebnisse einer großen Aufgabe nach den Ergebnissen einer kleinen Aufgabe zu erhalten. (Nutzen Sie die Multi-Core-Funktionen voll aus, um große Probleme in Unterprobleme zu zerlegen. Mehrere CPUs können mehrere Unterprobleme gleichzeitig lösen und schließlich die Ergebnisse zusammenführen.)
2) ThreadLocalRandon ist eine Klasse zur gleichzeitigen Zufallszahlengenerierung, um die Thread-Sicherheit der gleichzeitigen Zufallszahlengenerierung sicherzustellen. Tatsächlich wird Threadlocal verwendet. 3) Phaser-Klasse
java5 hat ein Parallelitätspaket. Es gibt Semaphor (Semaphor), CountDownLatch (Sperre) und CyclicBarrier (Zaun). Die Phaser-Klasse optimiert CountDownLatch und CyclicBarrier.
Semaphor: Ein Semaphor kann mehrere Sperren deklarieren (einschließlich einer Sperre: Dies ist ein sich gegenseitig ausschließendes Semaphor).
Zum Beispiel: Wenn ein Raum nur Platz für 5 Personen bietet, müssen die zusätzlichen Personen vor der Tür warten. Wie geht das? Eine Lösung besteht darin, fünf Schlüssel vor den Raum zu hängen, und jeder, der hereinkommt, nimmt einen Schlüssel mit. Wer keinen Schlüssel hat, kann den Raum nicht betreten, sondern wartet draußen. Jedes Mal, wenn jemand herauskommt, stecken Sie den Schlüssel wieder an seinen ursprünglichen Platz, um anderen den erneuten Zutritt zu erleichtern.
Wird hauptsächlich zur Steuerung der maximalen Anzahl von Threads verwendet, auf die zugegriffen werden kann. Die Vorgabe ist unfair. Die Fairness einer Sperre kann explizit über den Konstruktor deklariert werden.
Latching:
Bedeutung: CountDownLatch kann als Zähler verstanden werden, der während der Initialisierung einen Anfangswert festlegt. Wenn ein Thread zuerst auf den Abschluss bestimmter Vorgänge warten muss, muss er die Methode „await()“ aufrufen. Diese Methode versetzt den Thread in den Ruhezustand, bis alle wartenden Threads die Ausführung abgeschlossen haben. Bei jedem Aufruf der countDown()-Methode wird der interne Zähler um 1 dekrementiert, bis er aufwacht, wenn der Zähler 0 erreicht. Dies kann als spezielle CyclicBarrier verstanden werden. Der Thread-Synchronisationspunkt ist etwas Besonderes und beginnt, wenn der interne Zählerwert 0 erreicht. Methoden: Zwei Kernmethoden: countDown() undawait(). countDown(): Dekrementieren Sie den von CountDownLatch verwalteten internen Zähler um 1 und rufen Sie ihn auf, wenn jeder wartende Thread abgeschlossen ist. await(): Wenn der Thread CountDownLatch ausführt, wird der Thread in den Ruhezustand versetzt.
Beispiel: Besprechungsbeispiel: Warten Sie im Konferenzraum, bis alle Teilnehmer eingetroffen sind, bevor die Besprechung beginnen kann.
Zaun:Bedeutung: Ein Zaun ermöglicht die Synchronisierung von zwei oder mehr Threads an einem bestimmten Rendezvouspunkt. Wenn ein Thread den Treffpunkt erreicht, ruft er die Methode „await()“ auf, um auf andere Threads zu warten. Nachdem der Thread die Methode „await()“ aufgerufen hat, blockiert CyclicBarrier den Thread und versetzt ihn in den Ruhezustand, um auf die Ankunft anderer Threads zu warten. Wenn der letzte Thread die Methode „await()“ aufruft, weckt CyclicBarrier alle wartenden Threads auf und diese Threads setzen dann die Ausführung fort. CyclicBarrier kann ein anderes Runnable-Objekt als Initialisierungsparameter übergeben. Wenn alle Threads am Treffpunkt ankommen, führt die CyclicBarrier-Klasse das Runnable-Objekt als Thread aus.
Methode: waiting(): Den Thread bis zum Eintreffen des letzten Threads in den Ruhezustand versetzen und alle schlafenden Threads aufwecken.
Der Unterschied zwischen
und CountDownLatch:
Akzeptiert ein Objekt vom Typ Runnable zur späteren Ausführung, nachdem alle Threads am Rendezvouspunkt angekommen sind.
Es gibt keine Anzeige zum Aufrufen der CountDown()-Methode.
CountDownLatch kann im Allgemeinen nur einmal verwendet werden , CyclicBarrier kann mehrfach verwendet werden
Anwendungsszenario: Mehrere Threads führen Aufgaben aus und übergeben sie dann zur Zusammenfassung an nachfolgende Threads, nachdem sie den Rendezvouspunkt für die Synchronisierung erreicht haben.
Phaser:Bedeutung: Eine komplexere und leistungsfähigere Synchronisationshilfsklasse. Es ermöglicht die gleichzeitige Ausführung mehrstufiger Aufgaben. Wenn wir gleichzeitige Aufgaben haben und diese zur Ausführung in mehrere Schritte aufteilen müssen (CyclicBarrier ist in zwei Schritte unterteilt), können wir uns für die Verwendung von Phaser entscheiden. Der Phaser-Klassenmechanismus synchronisiert Threads am Ende jedes Schritts. Wenn alle Threads diesen Schritt abgeschlossen haben, kann der nächste Schritt ausgeführt werden. Wie bei anderen Synchronisierungstools muss die Anzahl der an Synchronisierungsvorgängen beteiligten Aufgaben in der Phaser-Klasse initialisiert werden. Der Unterschied besteht darin, dass die Anzahl der Aufgaben dynamisch erhöht oder verringert werden kann.
Funktion: ankommenAndAwaitAdvance(): Ähnlich wie die Methodewait() von CyclicBarrier wartet sie auf das Eintreffen anderer Threads und setzt die Ausführung synchron fort. ankommenAndDeregister(): Melden Sie den hier ausgeführten Thread von Phaser ab. isTerminated(): Bestimmen Sie, ob Phaser beendet wird. register(): Registrieren Sie einen neuen Teilnehmer in Phaser. Dieser neue Teilnehmer wird als Thread betrachtet, der diese Phase noch nicht abgeschlossen hat. forceTermination(): Erzwinge, dass Phaser in den Beendigungszustand wechselt
Beispiel: Verwenden Sie die Phaser-Klasse, um drei gleichzeitige Aufgaben zu synchronisieren. Diese drei Aufgaben suchen in drei verschiedenen Ordnern und deren Unterordnern nach Dateien mit der Erweiterung .log, die in den letzten 24 Stunden geändert wurden. Diese Aufgabe ist in die folgenden drei Schritte unterteilt: Dateien suchen, Dateien filtern und Ergebnisse drucken. Und nachdem Sie nach Dateien gesucht und gefiltert haben, analysieren Sie die Ergebnisse. Wenn sie leer sind, melden Sie sich von diesem Thread bei Phaser ab. Mit anderen Worten: In der nächsten Phase nimmt der Thread nicht an der Ausführung teil. In der Methode run() wird zu Beginn die Methode ArrivalAndAwaitAdvance() des Phasers aufgerufen, um sicherzustellen, dass alle Threads gestartet werden, bevor mit der Suche nach Dateien begonnen wird. Nach den Phasen „Datei suchen“ und „Datei filtern“ werden die Ergebnisse verarbeitet. Das heißt: Wenn das Ergebnis leer ist, entfernen Sie den Thread. Wenn er nicht leer ist, warten Sie, bis alle Threads in dieser Phase den Schritt abgeschlossen haben, bevor Sie den nächsten Schritt einheitlich ausführen. Nachdem die Aufgabe ausgeführt wurde, werden schließlich alle Threads in Phaser abgemeldet.
Phaser hat tatsächlich zwei Zustände: den aktiven Zustand und den beendeten Zustand. Phaser ist aktiv, wenn Threads an der Synchronisierung teilnehmen. Und am Ende jeder Etappe synchronisiert. Wenn alle an der Synchronisierung beteiligten Threads nicht registriert sind, befindet sich Phase im beendeten Zustand. In diesem Zustand hat Phaser keine Aufgabenteilnehmer.
Die Hauptfunktion von Phaser besteht darin, mehrstufige Aufgaben auszuführen und die Thread-Synchronisierung an jedem Phasenpunkt sicherzustellen. Teilnehmer können auch an jedem Etappenpunkt von der Teilnahme ausgeschlossen oder von ihnen ausgeschlossen werden. Dabei handelt es sich im Wesentlichen um die Methoden ankommenAndAwaitAdvance() und register() sowie ankommenAndDeregister().
4) Netzwerkverbesserung
URLClassLoader-Schließmethode hinzugefügt, die das spätere Neuladen von Klassendateien nicht zu Problemen mit der Ressourcenbelegung oder der Unmöglichkeit der Freigabe führen kann.
5) MultithreadedCustom Class Loader
Lösen Sie das Deadlock-Problem, das durch gleichzeitiges Laden von Klassen verursacht werden kann. Dies wird durch einige neue Versionen von jdk1.6 gelöst, und jdk7 hat auch einige Optimierungen vorgenommen.
Java1.81. Standardmethode der Schnittstelle
Vor Java 1.8 mussten alle Methoden in der Schnittstelle abstrakte Methoden sein. Java 8 ermöglicht es uns, der Schnittstelle eine nicht abstrakte Methodenimplementierung hinzuzufügen. Verwenden Sie einfach die standardmäßigen Just-Schlüsselwörter.
2. Lambda-Ausdruck
Damit können wir Verhalten an die Funktion übergeben. Wenn Sie vor Java 8 Verhalten an eine Funktion übergeben wollten, war Ihre einzige Option eine anonyme Klasse, die 6 Codezeilen erforderte. Die wichtigste Codezeile, die das Verhalten definiert, ist in der Mitte vergraben und fällt nicht ausreichend auf. Lambda-Ausdrücke ersetzen anonyme Klassen, eliminieren Vorlagen und ermöglichen das Schreiben von Code in einem funktionalen Stil. Dies führt manchmal zu einer besseren Lesbarkeit und einem klareren Ausdruck.
3. Funktionale Schnittstelle
Wenn eine Schnittstelle eine eindeutige abstrakte Methode definiert, wird diese Schnittstelle zu einer funktionalen Schnittstelle. Eine sehr wertvolle Eigenschaft funktionaler Schnittstellen besteht darin, dass sie mithilfe von Lambdas instanziiert werden können.
4. Methoden- und Konstruktorreferenzen
Verwenden Sie Schlüsselwörter, um Methoden- oder Konstruktorreferenzen zu übergeben.
5. Lambda-Bereich
Der Zugriff auf den äußeren Bereich in Lambda-Ausdrücken ist dem in älteren Versionen anonymer Objekte sehr ähnlich. Sie können direkt auf äußere lokale Variablen zugreifen, die als „final“ gekennzeichnet sind, oder auf Instanzfelder und statische Variablen.
6. Zugriff auf lokale Variablen
Sie können in Lambda-Ausdrücken direkt auf äußere lokale Variablen zugreifen.
7. Zugriff auf Objektfelder und statische Variablen
Im Gegensatz zu lokalen Variablen sind die internen Felder und statischen Variablen von Lambda sowohl lesbar als auch beschreibbar. Dieses Verhalten stimmt mit anonymen Objekten überein.
🎜8. Die Standardmethode für den Zugriff auf die Schnittstelle🎜JDK1.8 API enthält viele integrierte Funktionsschnittstellen, die häufig in altem Java verwendet werden, wie z. B. Comparator- oder Runnable-Schnittstellen. Diese Schnittstellen verfügen über hinzugefügte Anmerkungen, damit sie mit Lambdas verwendet werden können.
Java 8 API bietet auch viele neue funktionale Schnittstellen, um die Arbeit komfortabler zu gestalten. Auch wenn Sie mit diesen vertraut sind, müssen Sie sich noch ansehen, wie diese auf Lambda erweitert werden.
Weitere verwandte Artikel finden Sie auf der Chinesischen PHP-Website! !
Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen jdk1.7 und jdk1.8?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!