Im Folgenden finden Sie beliebte Interviewfragen im Zusammenhang mit Java -Threads. Sie können sie verwenden, um sich auf das Interview vorzubereiten.
1) Was ist ein Thread?
Ein Thread ist das kleinste Gerät, das das Betriebssystem Vorgänge und Planung durchführen kann. Es ist im Prozess enthalten und ist die tatsächliche Betriebseinheit im Prozess. Programmierer können Multiprozessoren durch sie programmieren und Sie können operativintensive Aufgaben mit Multithreading beschleunigen. Wenn beispielsweise 100 Millisekunden für einen Thread erforderlich sind, um eine Aufgabe zu erledigen, benötigt es nur 10 Millisekunden für einen Thread, um die Änderung der Aufgabe mit zehn Threads abzuschließen. Java bietet eine hervorragende Unterstützung für Multithreading auf Sprachebene und ist auch ein gutes Verkaufsargument. Weitere Informationen finden Sie hier.
2) Was ist der Unterschied zwischen einem Faden und einem Prozess?
Themen sind Untergruppen von Prozessen. Ein Prozess kann viele Threads haben und jeder Thread führt parallel unterschiedliche Aufgaben aus. Unterschiedliche Prozesse verwenden unterschiedliche Speicherräume, während alle Threads den gleichen Speicherplatz teilen. Mach es nicht mit Stack -Speicher, jeder Thread hat einen separaten Stack -Speicher zum Speichern lokaler Daten. Weitere Informationen finden Sie hier.
3) Wie kann man Themen in Java implementieren?
Es gibt zwei Möglichkeiten auf Sprachebene. Eine Instanz der Klasse von Java.lang.Thread ist ein Thread, aber sie muss die Ausführung von Java.lang.Runnable aufrufen. Da es sich bei der Thread -Klasse selbst um die runnable Schnittstelle handelt, können Sie die Klasse java.lang.thread erben oder die Runnable -Schnittstelle direkt aufrufen, um die Methode run () zu überschreiben, um den Thread zu implementieren. Weitere Informationen finden Sie hier.
4) Runnable oder Thread verwenden?
Diese Frage ist eine Folge der vorherigen Frage. Jeder weiß, dass wir Threads implementieren können, indem wir die Thread -Klasse erben oder die Runnable -Schnittstelle aufrufen. Die Frage ist, welche Methode ist besser? Unter welchen Umständen sollte ich es verwenden? Diese Frage ist leicht zu beantworten, wenn Sie wissen, dass Java die mehrfache Vererbung von Klassen nicht unterstützt, aber Sie können mehrere Schnittstellen aufrufen. Wenn Sie also andere Klassen erben möchten, ist es natürlich besser, die Runnable -Schnittstelle zu nennen. Weitere Informationen finden Sie hier.
6) Was ist der Unterschied zwischen Start () und Run () -Methoden in der Thread -Klasse?
Diese Frage wird oft gestellt, kann aber immer noch das Verständnis des Interviewers für das Java -Threading -Modell davon unterscheiden. Die Start () -Methode wird verwendet, um den neu erstellten Thread zu starten, und die Run () -Methode wird intern aufgerufen, was sich vom Effekt des direkten Aufrufens der Run () -Methode unterscheidet. Wenn Sie die Run () -Methode aufrufen, wird sie nur im ursprünglichen Thread aufgerufen. Wenn kein neuer Thread gestartet wird, startet die Start () -Methode den neuen Thread. Für weitere Diskussionen klicken Sie bitte hier
7) Was ist der Unterschied zwischen Runnable und Callable in Java?
Sowohl Runnable als auch Callable stellen Aufgaben dar, die in verschiedenen Threads ausgeführt werden sollen. Runnable ist seit JDK1.0 erhältlich und Callable wurde in JDK1.5 hinzugefügt. Ihr Hauptunterschied besteht darin, dass die CALL () -Methode von Callable Werte zurückgeben und Ausnahmen veröffentlichen kann, während die Run () -Methode von Runnable diese Funktionen nicht aufweist. Callable kann ein zukünftiges Objekt zurückgeben, das mit den Berechnungsergebnissen geladen wird. Mein Blog enthält detailliertere Anweisungen.
8) Was ist der Unterschied zwischen Cyclicbarrier und Countdownlatch in Java?
Sowohl CyclicBarrier als auch Countdownlatch können verwendet werden, damit eine Gruppe von Threads auf andere Threads warten. Im Gegensatz zu CyclicBarrier kann Countdownlatch nicht wiederverwendet werden. Klicken Sie hier, um weitere Informationen und Beispielcode anzuzeigen.
9) Was ist das Java -Speichermodell?
Das Java -Speichermodell spezifiziert und leitet Java -Programme, um sich deterministisch zwischen verschiedenen Speicherarchitekturen, CPUs und Betriebssystemen zu verhalten. Es ist besonders wichtig in Multi-Threading-Situationen. Das Java -Speichermodell kann sicherstellen, dass die von einem Thread vorgenommenen Änderungen für andere Threads sichtbar sind und zuerst Beziehungen auftreten. Diese Beziehung definiert einige Regeln, um Programmierer in ihrer gleichzeitigen Programmierung klarer zu machen. Zum Beispiel sicheret eine Beziehung zuerst:
Code in Threads kann nacheinander ausgeführt werden, was als Programmreihenregeln bezeichnet wird.
Bei derselben Sperre muss ein Entsperrvorgang vor einem weiteren Sperrvorgang erfolgen, der rechtzeitig auftritt, was auch als Verwaltungsverriegelungsregel bezeichnet wird.
Der vorherige Schreibvorgang zu einem flüchtigen Bestand ist vor dem nächsten Lesevorgang eines flüchtigen Bestandteils, das auch als variable Regel bezeichnet wird.
Jede Operation in einem Thread muss nach dem Start () dieses Threads aufgerufen werden, auch als Thread Start -Regel bezeichnet.
Alle Operationen eines Threads werden vor dem Thread beendet.
Der Abschlussbetrieb eines Objekts muss nach der Konstruktion des Objekts erfolgen, was auch als Objektbeendungsregel bezeichnet wird.
Transitiv
Ich empfehle dringend, dass Sie Kapitel 16 der "Java -Parallelitätsprogrammierungspraxis" lesen, um Ihr Verständnis des Java -Speichermodells zu vertiefen.
10) Was ist die volatile Variable in Java?
Volatile ist ein spezieller Modifikator, der nur von Mitgliedsvariablen verwendet werden kann. In dem Fall, in dem Java -gleichzeitige Programme nicht synchrone Klassen haben, sind Multithreading -Operationen für Mitgliedervariablen für andere Threads transparent. Die volatile Variable kann sicherstellen, dass der nächste Lesevorgang nach dem vorherigen Schreibvorgang stattfindet, was die variable Regel der vorherigen Frage ist. Klicken Sie hier, um mehr volatilen Inhalt zu sehen.
11) Was ist Fadensicherheit? Ist Vector eine thread-sichere Klasse? (Weitere Informationen finden Sie hier)
Wenn Ihr Code im Vorgang ist, in dem Sie sich befinden, werden gleichzeitig mehrere Threads ausgeführt, und diese Threads können diesen Code gleichzeitig ausführen. Wenn das Ergebnis jedes Laufs dem Ergebnis eines einzelnen Thread-Laufs übereinstimmt und die Werte anderer Variablen übereinstimmen, ist es mit Thread-Safe. Das gleiche Instanzobjekt einer thread-sicheren Zählerklasse verursacht keine Berechnungsfehler, wenn sie von mehreren Threads verwendet werden. Offensichtlich können Sie die Sammlungsklasse in zwei Gruppen unterteilen: Thread-Safe und Nicht-Thread-Safe. Vector verwendet Synchronisationsmethoden, um Thread-Safety zu erreichen, während ArrayList-ähnliche ähnliche Thread-Safe ist.
12) Was sind Rennbedingungen in Java? Geben Sie ein Beispiel an.
Rennbedingungen führen zu einigen Fehler in gleichzeitigen Situationen des Programms. Wenn Multi-Threading um einige Ressourcen konkurriert, entstehen Rennbedingungen. Wenn das erste Programm fehlschlägt und später ausgeführt wird, werden im gesamten Programm einige unsichere Fehler angezeigt. Solche Fehler sind aufgrund der zufälligen Konkurrenz zwischen Threads schwer zu erkennen und wiederzukehren. Ein Beispiel ist eine ungeordnete Verarbeitung. Weitere Informationen finden Sie in der Antwort.
13) Wie kann man einen Thread in Java anhalten?
Java stellt eine reiche API bereit, bietet jedoch keine API zum Anhalten von Threads. JDK 1.0 hatte ursprünglich einige Kontrollmethoden wie Stop (), suspend () und resume (), aber aufgrund potenzieller Deadlock -Bedrohungen wurden sie in nachfolgenden JDK -Versionen veraltet. Danach lieferte der Designer der Java-API keine kompatible und fadensichere Möglichkeit, einen Faden zu stoppen. Wenn die Methode run () oder call () ausgeführt wird, endet der Thread automatisch. Wenn Sie einen Thread manuell beenden möchten, können Sie mit der volatilen booleschen Variablen die Run () -Methodenschleife beenden oder die Aufgabe zum Unterbrechen des Threads abbrechen. Klicken Sie hier, um den Beispielcode anzuzeigen.
14) Was passiert, wenn eine Ausnahme auftritt, wenn ein Thread ausgeführt wird?
Dies ist eine sehr knifflige Java -Interviewfrage, die mir in einem Interview gestoßen ist. Einfach ausgedrückt, wenn die Ausnahme nicht gefangen wird, hört der Thread auf, auszuführen.
Thread.uncaughexceptionHandler ist eine eingebettete Schnittstelle zum Umgang mit ungewöhnlichen Ausnahmen, die plötzliche Fadenunterbrechungen verursachen. Wenn eine ungewöhnliche Ausnahme dazu führt, dass ein Thread unterbricht, verwendet der JVM Thread.getungauglexceptionHandler (), um die UncaugtexceptionHandler des Threads abzufragen und den Thread und die Ausnahme als Parameter zur Verarbeitung der Handler -Methode des Handlers zu übergeben.
15) Wie teile ich Daten zwischen zwei Threads?
Sie können dies tun, indem Sie Objekte teilen oder gleichzeitige Datenstrukturen wie die Blockierung von Warteschlangen verwenden. In diesem Tutorial "Java Inter-Thread Communication" (bei der Objekte zwischen zwei Threads teilen) wird die Wartezeit verwendet und die Methoden zur Implementierung des Verbrauchermodells des Herstellers benachrichtigt.
16) Was ist der Unterschied zwischen Benachrichtigung und Benachrichtigung in Java?
Dies ist ein weiteres kniffliges Problem, da Multithreading auf einzelne Überwachungsresseln warten kann, und Java -API -Designer bieten einige Möglichkeiten, sie zu benachrichtigen, wenn sie auf die Änderung der Bedingungen warten, diese Methoden sind jedoch nicht vollständig implementiert. Die Benachrichtigung () -Methode kann keinen bestimmten Thread aufwecken, sodass sie nur dann funktioniert, wenn ein Thread wartet. Und notifyall () weckt alle Threads und ermöglicht es ihnen, um Schlösser zu konkurrieren, um sicherzustellen, dass mindestens ein Thread weiter ausgeführt werden kann. Mein Blog enthält detailliertere Informationen und Beispielcode.
17) Warum werden Methoden warten, benachrichtigen und benachrichtigen, nicht in der Thread -Klasse?
Dies ist eine designbezogene Frage, die die Wahrnehmung vorhandener Systeme durch den Interviewer untersucht und etwas, das häufig ist, aber unangemessen zu sein scheint. Bei der Beantwortung dieser Fragen müssen Sie erklären, warum es sinnvoll ist, diese Methoden in die Objektklasse zu setzen, und warum nicht in die Thread -Klasse einfügen. Ein offensichtlicher Grund ist, dass die von Java bereitgestellten Schlösser eher Objektebene als Fadenebene sind und jedes Objekt über eine Überdachung verfügt, die über Threads erhalten wird. Wenn der Thread auf einige Schlösser warten muss, ist es sinnvoll, die Wait () -Methode im Objekt aufzurufen. Wenn die Wait () -Methode in der Thread -Klasse definiert ist, ist nicht offensichtlich, auf welche Sperre der Thread wartet. Einfach ausgedrückt, da warten, benachrichtigen und notifyall sind, sind sie in der Objektklasse definiert, da das Schloss zum Objekt gehört. Sie können diesen Artikel auch überprüfen, um mehr zu erfahren.
18) Was ist eine ThreadLocal -Variable?
ThreadLocal ist eine spezielle Variable in Java. Jeder Thread hat einen ThreadLocal, was bedeutet, dass jeder Thread eine eigene unabhängige Variable hat und die Rennbedingungen vollständig beseitigt sind. Es ist eine großartige Möglichkeit, Thread-Safe für das Erstellen teurer Objekte zu erhalten. Sie können beispielsweise ThreadLocal verwenden, um SimpledateFormat-Thread-Safe zu erstellen, da diese Klasse teuer zu erstellen ist und für jeden Anruf eine andere Instanz erstellen muss, sodass sie es nicht wert ist, sie lokal zu verwenden. Wenn Sie jedem Thread eine eindeutige Kopie von Variablen zur Verfügung stellen, verbessert dies die Effizienz erheblich. Erstens wird die Anzahl der teuren Objekte durch Multiplexing reduziert. Zweitens erhalten Sie Gewindesicherheit ohne kostspielige Synchronisation oder Invarianz. Ein weiteres gutes Beispiel für lokale Thread-Variablen ist die ThreadLocalRandom-Klasse, die die Anzahl der teuren zufälligen Objekte reduziert, die in einer Umgebung mit mehreren Threaden erstellt wurden. Sehen Sie die Antworten, um mehr zu erfahren.
19) Was ist Futuretask?
In einem gleichzeitigen Java -Programm stellt Futuretask einen asynchronen Betrieb dar, der abgesagt werden kann. Es verfügt über Methoden wie das Starten und Abbrechen von Vorgängen, Abfragen, ob die Operationen abgeschlossen sind und die Betriebsergebnisse abrufen. Das Ergebnis kann nur abgerufen werden, wenn der Betrieb abgeschlossen ist. Wenn der Vorgang nicht abgeschlossen ist, blockiert die GET -Methode. Ein Futuretask -Objekt kann Objekte einwickeln, die Callable und Runnable aufrufen. Da Futuretask auch die Runnable -Schnittstelle aufruft, kann sie an den Testamentsvollstrecker zur Ausführung übermittelt werden.
20) Was ist der Unterschied zwischen unterbrochenen und unterbrochenen Methoden in Java?
Der Hauptunterschied zwischen unterbrochen () und Issinrupted () besteht darin, dass der erstere den Interrupt -Zustand löschen wird, während die letztere dies nicht tun. Der Interrupt -Mechanismus des Java -Multithreading wird mit internen Kennungen implementiert. Wenn Sie Thread.Interrupt () aufrufen, um einen Thread zu unterbrechen, wird die Interrupt -Kennung auf true festgelegt. Wenn der Interrupt -Thread den statischen Methoden -Thread aufruft. Intrupted (), um den Interrupt -Zustand zu überprüfen, wird der Interrupt -Zustand gelöscht. Die nicht statische Methode wird interruptd () verwendet, um den Interrupt-Status anderer Threads abzufragen, ohne die Interrupt-Status-Kennung zu ändern. Einfach ausgedrückt wird jede Methode, die eine InterruptedException auswirft, den Interrupt -Zustand. In jedem Fall kann der Interrupt -Status eines Threads durch andere Threads geändert werden, die Interrupts anrufen.
21) Warum müssen Sie in einem synchronen Block warten und benachrichtigen müssen?
Dies liegt hauptsächlich daran, dass die Java -API dies erzwingt, und wenn Sie dies nicht tun, wird Ihr Code eine illegaleMonitorStateException -Ausnahme ausgelöst. Ein weiterer Grund ist, Rennbedingungen zwischen Wartezeit und Benachrichtigung zu vermeiden.
22) Warum sollten Sie die Wartebedingungen in der Schleife überprüfen?
Themen im Wartezustand erhalten möglicherweise Fehlerbenachrichtigungen und Pseudo-Wakes. Wenn der Wartezustand in der Schleife nicht überprüft wird, wird das Programm ohne die Endbedingung begegnet. Wenn ein wartender Thread aufwacht, kann er nicht berücksichtigen, dass sein ursprünglicher Wartezustand immer noch gültig ist und sich während dieser Zeit nach dem Aufruf von Benachrichtigung () und vor dem Wartefaden in dieser Zeit ändern kann. Aus diesem Grund funktioniert die Verwendung der Wait () -Methode in einer Schleife besser. Wenn Sie mehr über dieses Problem erfahren möchten, empfehle ich Ihnen, die Kapitel über Threading und Synchronisierungskapitel im Buch "Effektiver Java" zu lesen.
23) Was ist der Unterschied zwischen synchronen Sammlungen und gleichzeitigen Sammlungen in Java?
Sowohl synchrone Sammlungen als auch gleichzeitige Sammlungen bieten geeignete Gewindekollektionen für Multithreading und Parallelität, aber gleichzeitige Sammlungen sind skalierbarer. Vor Java 1.5 verwendeten Programmierer nur synchrone Sammlungen, und wenn die Parallelität mit mehreren Threads beigetragen hatte, würde dies zu Streitigkeiten führen, was die Skalierbarkeit des Systems behinderte. JAVA5 führt zu Concurrent Collections wie Concurrenthashmap ein, die nicht nur die Sicherheit von Fäden bietet, sondern auch die Skalierbarkeit mit modernen Technologien wie Sperrtrennung und Innenzonen verbessert. Weitere Informationen finden Sie in der Antwort.
24) Was ist der Unterschied zwischen Heap und Stapel in Java?
Warum wird diese Frage in Multi-Thread-und gleichzeitigen Interviewfragen klassifiziert? Weil der Stapel ein Speicherbereich ist, der eng mit dem Thread verwandt ist. Jeder Thread verfügt über einen eigenen Stack -Speicher, mit dem lokale Variablen, Methodenparameter und Stapelaufrufe gespeichert werden. Die in einem Thread gespeicherten Variablen sind für andere Threads unsichtbar. Der Haufen ist ein gemeinsamer Speicherbereich, der von allen Threads geteilt wird. Objekte werden im Haufen erstellt. Um die Effizienz zu verbessern, wird der Thread A vom Haufen zu seinem eigenen Stapel zwischengespeichert. Wenn mehrere Threads diese Variable verwenden, kann dies zu Problemen führen. Zu diesem Zeitpunkt kann die volatile Variable eine Rolle spielen, für die der Thread den Wert der Variablen aus dem Hauptspeicher lesen muss.
Weitere Informationen finden Sie in der Antwort.
25) Was ist ein Fadenpool? Warum es benutzen?
Das Erstellen von Threads erfordert teure Ressourcen und Zeit. Wenn nur nach der Aufgabe ein Thread erstellt wird, wird die Antwortzeit länger und ein Prozess kann eine begrenzte Anzahl von Threads erstellen. Um diese Probleme zu vermeiden, werden mehrere Themen erstellt, um zu reagieren und zu verarbeiten, wenn das Programm gestartet wird. Sie werden als Threadpools bezeichnet, und die Fäden in Inneren werden als Worker -Threads bezeichnet. Beginnend mit JDK1.5 bietet die Java -API das Executor -Framework, mit dem Sie verschiedene Thread -Pools erstellen können. Zum Beispiel ein einzelner Threadpool, der jeweils eine Aufgabe erledigt; Eine feste Anzahl von Threadpools oder Cache-Thread-Pools (ein erweiterbarer Threadpool, der für viele Programme mit kurzlebigen Aufgaben geeignet ist). Weitere Informationen finden Sie in diesem Artikel.
26) Wie schreibe ich Code, um die Probleme des Herstellers und der Verbraucher zu lösen?
In Wirklichkeit gehören viele der von Ihnen gelösten Fadenprobleme zum Verbrauchermodell des Herstellers, was eine Thread -Produktionsaufgabe für den Konsum durch andere Threads ist. Sie müssen wissen, wie Sie zwischen Threads kommunizieren, um dieses Problem zu lösen. Die relativ niedrige Methode besteht darin, Wartezeit zu verwenden und zu benachrichtigen, um dieses Problem zu lösen. Die hervorragende Methode ist die Verwendung von Semaphor oder Blockingqueue, um das Hersteller- und Verbrauchermodell zu implementieren. Dieses Tutorial implementiert es.
27) Wie kann man Deadlocks vermeiden?
Deadlock in Java Multithreading
Deadlock bezieht sich auf ein Phänomen des gegenseitigen Wartens, das durch zwei oder mehr Prozesse während des Ausführungsprozesses aufgrund des Wettbewerbs um Ressourcen verursacht wird. Ohne externe Kräfte können sie nicht weitermachen. Dies ist ein ernstes Problem, da Deadlocks Ihr Programm suspendiert und die Aufgabe nicht erledigen kann. Die folgenden vier Bedingungen müssen für das Auftreten von Deadlocks erfüllt sein:
Gegenseitige Ausschlussbedingung: Eine Ressource kann jeweils nur von einem Prozess verwendet werden.
Anfragen und Halten von Bedingungen: Wenn ein Prozess aufgrund von Ressourcen blockiert, hält er die erworbenen Ressourcen.
Bedingungen für die Nicht -Entfernung: Die vom Prozess erhaltenen Ressourcen können bis zum Ende der Verwendung nicht gewaltsam entzogen werden.
Schleifenwartungsbedingungen: Zwischen mehreren Prozessen, die in Kopf und Schwanz verbunden sind, wird eine Ressourcenbeziehung für Schleifenwartungen hergestellt.
Der einfachste Weg, um Deadlocks zu vermeiden, besteht darin, die Wartebedingungen für Schleifen zu verhindern, Flags festzulegen und alle Ressourcen im System zu sortieren und festzustellen, dass alle Prozessanwendungsressourcen in einer bestimmten Reihenfolge (aufsteigender oder absteigender Reihenfolge) betrieben werden müssen, um Deadlocks zu vermeiden. Dieses Tutorial enthält Code -Beispiele und Diskussionsdetails zum Vermeiden von Deadlocks.
28) Was ist der Unterschied zwischen lebenden Schlössern und Deadlocks in Java?
Dies ist die Erweiterung der vorherigen Frage. Live -Schlösser ähneln Deadlocks. Der Unterschied besteht darin, dass sich der Zustand des Fadens oder der Prozess in der Live -Schloss ständig ändert. Lebende Schlösser können als besondere Art von Hunger angesehen werden. Ein realistisches Beispiel für ein lebendes Schloss ist, wenn sich zwei Menschen in einem engen Korridor treffen. Beide versuchen, sich gegenseitig zu vermeiden, damit einander durchgehen kann, aber weil die Richtung der Vermeidung gleich ist, kann niemand am Ende durch den Korridor gehen. Einfach ausgedrückt, der Hauptunterschied zwischen einem lebenden Schloss und einem toten Schloss besteht darin, dass der Zustand des ersteren Prozesses geändert werden kann, aber nicht weiter ausgeführt werden kann.
29) Wie kann ich feststellen, ob ein Faden ein Schloss hat?
Ich wusste nie, dass wir tatsächlich erkennen konnten, ob ein Thread ein Schloss hatte, bis ich an einem Telefoninterview teilnahm. In java.lang.thread namens HoldsLock () gibt es eine Methode, die nur dann true zurückgibt, wenn der aktuelle Thread eine Sperre für ein bestimmtes Objekt besitzt. Sie können diesen Artikel überprüfen, um mehr zu erfahren.
30) Wie bekommt man Thread Stapel in Java?
Für verschiedene Betriebssysteme gibt es mehrere Möglichkeiten, den Thread -Stapel von Java -Prozessen zu erhalten. Wenn Sie den Thread -Stapel erhalten, speichert der JVM den Status aller Threads in der Protokolldatei oder in die Konsole aus. In Windows können Sie die Ctrl + Break -Schlüsselkombination verwenden, um den Thread -Stapel zu erhalten, und den Befehl Kill -3 unter Linux verwenden. Sie können auch das JStack -Tool verwenden, um es zu erhalten, das mit Thread -IDs betrieben wird, und das JPS -Tool verwenden, um die ID zu finden.
31) Mit welchem Parameter in JVM wird der Stapel von Fäden mit einem kleinen Stapel gesteuert
Dieses Problem ist sehr einfach, der Parameter -XSS wird verwendet, um die Stapelgröße des Fadens zu steuern. Sie können die JVM -Konfigurationsliste für weitere Informationen zu diesem Parameter anzeigen.
32) Was ist der Unterschied zwischen synchronisiertem und Wiedereintritt in Java?
Java konnte lange Zeit durch synchronisierte Schlüsselwörter gegenseitig ausgeschlossen werden, und es hat einige Nachteile. Sie können beispielsweise keine anderen Methoden oder Blockgrenzen als Schlösser erweitern, und Sie können nicht auf halbem Weg abbrechen, wenn Sie versuchen, Schlösser usw. zu erwerben. Die Reentrantlock -Klasse implementiert Lock, das die gleiche Parallelitäts- und Gedächtnissemantik wie synchronisiert aufweist und auch erweiterbar ist. Sie können diesen Artikel überprüfen, um mehr zu erfahren
33) Es gibt drei Threads T1, T2 und T3. Wie kann ich sicherstellen, dass sie in Ordnung gebracht werden?
Es gibt viele Möglichkeiten, Threads in einer bestimmten Reihenfolge in Multithreading auszuführen. Sie können die moje () -Methode der Thread -Klasse verwenden, um einen anderen Thread in einem Thread zu starten, und ein anderer Thread vervollständigt den Thread, um die Ausführung fortzusetzen. Um die Reihenfolge von drei Threads zu gewährleisten, sollten Sie den letzten zuerst starten (T3 Call T2, T2 Anrufe T1), damit T1 zuerst abgeschlossen ist und T3 zuletzt abgeschlossen ist. Sie können diesen Artikel überprüfen, um mehr zu erfahren.
34) Was ist die Funktion der Ertragsmethode in der Thread -Klasse?
Die Ertragsmethode kann das aktuell ausgeführte Thread -Objekt pausieren und anderen Threads mit der gleichen Priorität ausführen. Es ist eine statische Methode und stellt nur sicher, dass der aktuelle Thread die CPU -Verwendung aufgibt und nicht garantieren kann, dass andere Threads die CPU besetzen können. Der Thread, der Rendite () ausführt, kann unmittelbar nach Eintritt in den pausierten Zustand ausgeführt werden. Klicken Sie hier, um mehr über die Ertragsmethode zu erfahren.
35) Was ist die Parallelität der Concurrenthashmap in Java?
Concurrenthashmap unterteilt die tatsächliche Karte in mehrere Teile, um ihre Skalierbarkeit und Fadensicherheit zu erreichen. Diese Teilung wird unter Verwendung von Parallelität erhalten, die ein optionaler Parameter für den Konstruktor der Concurrenthashmap -Klasse mit einem Standardwert von 16 ist, sodass in Multithreading -Situationen die Behauptung vermieden werden kann. Für mehr Parallelität und interne Größenänderung lesen Sie bitte meinen Artikel, wie die Concurrenthashmap in Java funktioniert.
36) Was ist Semaphor in Java?
Semaphor in Java ist eine neue Synchronisierungsklasse, die ein Zählsignal ist. Konzeptionell und konzeptionell behält Semaphore eine Reihe von Genehmigungen bei. Bei Bedarf wird jeder Erwerb () blockiert, bevor die Lizenz vor seiner Erlangung verfügbar ist. Jede Release () fügt eine Erlaubnis hinzu, die möglicherweise einen blockierenden Erwerber veröffentlichen. Ohne das tatsächliche Lizenzobjekt zählt Semaphor jedoch nur die verfügbaren Lizenznummern und ergriffen entsprechende Aktionen. Semaphoren werden häufig in Multithread -Code verwendet, wie z. B. Datenbankverbindungspools. Weitere Informationen finden Sie hier.
37) Wenn Sie eine Aufgabe einreichen, ist die Thread -Pool -Warteschlange voll. Was passiert, wenn es passiert?
Diese Frage ist schlau und viele Programmierer werden denken, dass die Aufgabe blockiert wird, bis die Thread -Pool -Warteschlange Platz hat. Wenn eine Aufgabe nicht ausgeführt werden kann, wird die Methode der ThreadPoolexecutor's subay () eine Ausnahme von RejejecedExecutionException ausgelegt.
38) Was ist der Unterschied zwischen den Methoden von Subjekt () und Execute () im Java -Thread -Pool?
Beide Methoden können Aufgaben am Thread -Pool übermitteln. Die Rückgabetyp von execute () ist ungültig, die in der Ausführungsschnittstelle definiert ist, und die Methode subjekt () kann das zukünftige Objekt zurückgeben, das die Berechnungsergebnisse enthält. Es ist in der ExecutorService -Schnittstelle definiert. Es erweitert die Executor -Schnittstelle. Andere Thread -Poolklassen wie ThreadPoolexecutor und ScheduledThreadpoolexecutor haben diese Methoden. Weitere Informationen finden Sie hier.
39) Was ist eine Blockierungsmethode?
Eine Blockierungsmethode bedeutet, dass das Programm darauf wartet, dass die Methode abgeschlossen ist und nichts anderes tut. Mit der Accept () -Methode des ServersSocket ist es zu warten, dass der Client eine Verbindung herstellt. Das Blockieren hier bedeutet, dass der aktuelle Thread ausgesetzt wird, bevor das Anrufergebnis zurückgegeben wird und erst zurückgegeben wird, wenn das Ergebnis erzielt wird. Darüber hinaus gibt es asynchrone und nicht blockierende Methoden, die zurückkehren, bevor die Aufgabe abgeschlossen ist. Weitere Informationen finden Sie hier.
40) Ist Swing-Faden sicher? Warum?
Sie können eine positive Antwort geben, Swing ist kein Thread-Safe, aber Sie sollten erklären, warum diese Antwort auch dann ist, wenn der Interviewer Sie nicht gefragt hat, warum. Wenn wir sagen, dass Swing nicht fadensicher ist, erwähnt es häufig seine Komponenten, die nicht in Multi-Threaded modifiziert werden können. Alle Updates für GUI -Komponenten müssen in AWT -Threads abgeschlossen sein. Swing bietet zwei synchrone und asynchrone Rückrufmethoden zum Aktualisieren. Klicken Sie hier, um weitere Inhalte mit Schwung und Sicherheit zu sehen.
41) Was ist der Unterschied zwischen Invokeandwait und Invokelater in Java?
Diese beiden Methoden werden von der Swing -API an Java -Entwickler zur Aktualisierung der GUI -Komponenten aus dem aktuellen Thread und nicht dem Ereignis -Versand -Thread zur Verfügung gestellt. Invokeandwait () synchron aktualisiert GUI -Komponenten wie eine Fortschrittsleiste. Sobald der Fortschritt aktualisiert ist, muss auch der Fortschrittsbalken entsprechend geändert werden. Wenn der Fortschritt von mehreren Threads nachverfolgt wird, wird die Methode für invokeandwait () aufgerufen, um den Ereignis -Versand -Thread anzufordern, um die Komponente entsprechend zu aktualisieren. Die Methode Invokelater () wird asynchron aufgerufen, um die Komponente zu aktualisieren. Weitere Informationen finden Sie hier.
42) Welche Methoden in der Swing-API sind fadensicher?
Diese Frage erwähnt auch die Sicherheit von Schwingen und Faden. Obwohl Komponenten nicht mit Thread-sicher sind, gibt es einige Methoden, die als mehrfach drohbar bezeichnet werden können, wie z. B. Repaint () und revalidat (). Die Methoden setText () von JTextComponent und den Methoden Insert () und append () von JTextArea sind ebenfalls thread-sicher.
43) Wie erstellt man ein unveränderliches Objekt in Java?
Dieses Problem scheint nichts mit Multi-Threading zu tun zu haben, aber Invarianz hilft dabei, bereits komplexe gleichzeitige Programme zu vereinfachen. Unveränderliche Objekte können ohne Synchronisation geteilt werden, wodurch der Synchronisationsaufwand beim gleichzeitigen Zugriff auf das Objekt reduziert werden kann. Java hat jedoch nicht die @immuthable Annotation. Um eine unveränderliche Klasse zu erstellen, müssen wir die folgenden Schritte implementieren: Initialisieren Sie alle Mitglieder über einen Konstruktor, geben Sie der Variablen keine Settermethode an und deklarieren Sie alle Mitglieder als privat, damit diese Mitglieder nicht direkt zugegriffen werden dürfen. Getter -Methode nicht direkt das Objekt selbst zurückgeben, sondern das Objekt klonen und eine Kopie des Objekts zurückgeben. Mein Artikel, wie ein Objekt in Java unveränderlich ist, hat detaillierte Tutorials, und Sie können nach dem Lesen voller Vertrauen sein.
44) Was ist ReadWriteLock in Java?
Im Allgemeinen sind Lese- und Schreibschlösser das Ergebnis der Sperrungstechnologie, die zur Verbesserung der Leistung gleichzeitiger Programme verwendet wird. ReadWriteLock in Java ist eine neue Schnittstelle, die in Java 5 hinzugefügt wurde. Ein ReadWriteLock unterhält ein Paar zugehörige Schlösser, eine für schreibgeschützte Operationen und eine für Schreibvorgänge. Ein Leseschloss kann von mehreren Lese -Threads gleichzeitig ohne einen Schreib Thread gehalten werden. Schreibschlösser sind exklusiv.
45) Was ist eine geschäftige Schleife im Multithreading?
Besetzte Schleifen sind, wenn Programmierer Schleifen verwenden, um einen Thread zu warten. Im Gegensatz zu herkömmlichen Methoden wie Wait (), Sleep () oder Rendite () geben sie alle die CPU -Kontrolle auf, während geschäftige Schleifen die CPU nicht aufgeben, sondern nur eine leere Schleife ausführt. Der Zweck davon ist, den CPU -Cache zu erhalten. In einem Multi-Core-System kann man in einem anderen Kernel aufwachen, der den Cache wieder aufbaut. Es steht zur Verfügung, um den Wiederaufbau des Cache zu vermeiden und die Zeit zu verkürzen, die auf den Wiederaufbau wartet. Sie können diesen Artikel für weitere Informationen überprüfen.
46) Was ist der Unterschied zwischen flüchtigen Variablen und atomaren Variablen?
Dies ist eine interessante Frage. Erstens sieht die volatile Variable der Atomvariablen sehr ähnlich, aber die Funktionen sind unterschiedlich. Die volatile Variable stellt sicher, dass eine Vorgängerbeziehung, dh Schreibvorgänge, vor nachfolgenden Lesevorgängen auftreten, die Atomizität jedoch nicht garantiert. Wenn Sie beispielsweise die Anzahl der Zählvariablen mit flüchtigem Umfang ändern, ist der Count ++ -Operationsbetrieb nicht atomar. Die von der Atomicinteger -Klasse bereitgestellte Atommethode kann diese Operation zu Atomic machen. Beispielsweise führt die Methode GetAndIncrement () Atom -Inkrementoperationen aus, um den aktuellen Wert um eins hinzuzufügen, und andere Datentypen und Referenzvariablen können auch ähnliche Operationen ausführen.
47) Was passiert, wenn ein Thread in einem Synchronisationsblock eine Ausnahme ausgelöst hat?
Diese Frage hat viele Java -Programmierer ausgetragen. Wenn Sie sich vorstellen können, ob der Schloss diesen Hinweis zur Beantwortung veröffentlicht, hoffen Sie immer noch, ihn richtig zu beantworten. Unabhängig davon, ob Ihr Synchronisationsblock normal oder abnormal ausgeht, werden die Threads im Inneren das Schloss freigesetzt. Daher bevorzuge ich den Synchronisationsblock im Vergleich zur Sperroberfläche, da ich nicht meine Energie ausgeben muss, um das Schloss freizugeben. Diese Funktion kann implementiert werden, indem der Sperre schließlich Block veröffentlicht wird.
48) Was ist das Doppel -Check -Sperre im Singleton -Modus?
Diese Frage wird oft in Java -Interviews gestellt, aber der Interviewer ist nur zu 50% mit der Beantwortung dieser Frage zufrieden. Die Hälfte der Menschen kann kein Doppelkontrollschloss schreiben und die Hälfte der Menschen können nicht sagen, dass es versteckte Gefahren sind und wie Java 1.5 es korrigiert hat. Es ist eigentlich eine alte Methode, um mit Thread-sichere Singletons zu erstellen. Wenn eine Singleton -Instanz zum ersten Mal erstellt wird, versucht es, die Leistung mit einem einzigen Schloss zu optimieren, aber weil sie zu komplex ist, fällt es in JDK1.4 aus, und ich persönlich mag es auch nicht. Wie auch immer, selbst wenn Sie es nicht mögen, müssen Sie es immer noch verstehen, weil es oft gefragt wird. Weitere Informationen finden Sie in der doppelten Überprüfung des SINGLETON -Werktartikels, um weitere Informationen zu erhalten.
49) Wie erstelle ich in Java einen thread-sffe-Singleton?
Dies ist eine Folge der obigen Frage. Wenn Sie keine Double Check -Schlösser mögen und der Interviewer nach einer alternativen Methode zum Erstellen einer Singleton -Klasse gefragt hat, können Sie die Funktionen der JVM -Klasse und statische Variablungsinitialisierungsfunktionen verwenden, um eine Singleton -Instanz zu erstellen oder Aufzählungsstypen zum Erstellen eines Singleton zu verwenden. Ich mag diese Methode. Sie können diesen Artikel für weitere Informationen überprüfen.
50) Schreiben Sie 3 Multithreading Best Practices, denen Sie folgen
Ich mag dieses Problem am meisten und ich glaube, Sie werden bestimmte Best Practices befolgen, wenn Sie gleichzeitig Code schreiben, um die Leistung zu verbessern. Hier sind drei Best Practices, von denen ich denke, dass sie die meisten Java -Programmierer folgen sollten:
Geben Sie Ihrem Thread einen aussagekräftigen Namen.
Dies erleichtert es einfach, Fehler zu finden oder sie zu verfolgen. OrderProcessor, Quotequessor oder Handelsprozessor Dieser Name ist viel besser als Thread-1. Thread-2 und Thread-3. Geben Sie dem Thread einen Namen, der sich auf die Aufgabe bezieht, die er ausführen möchte. Alle wichtigen Rahmenbedingungen und sogar JDKs folgen dieser besten Praxis.
Vermeiden Sie es, den Umfang der Synchronisation zu sperren und zu verengen
Schlösser sind teuer und der Kontextschalter ist zeitaufwändiger. Versuchen Sie, Synchronisation und Schlösser zu verwenden, um den kritischen Bereich zu minimieren. Daher bevorzuge ich die Synchronisationsblöcke gegenüber der Synchronisationsmethode, die mir die absolute Kontrolle über das Schloss verleiht.
Verwenden Sie mehr Synchronisierungsklassen und verwenden Sie weniger Warten und Benachrichtigungen
Erstens vereinfachen Countdownlatch-, Semaphor-, Cyclicbarrier- und Austauscher -Synchronklassen die Codierungsvorgänge, während es schwierig ist, die komplexen Steuerungsströme mit Warten und Benachrichtigungen zu steuern. Zweitens werden diese Klassen von den besten Unternehmen geschrieben und gepflegt. Sie werden in nachfolgenden JDKs weiterhin optimiert und verbessert. Mit diesen Synchronisierungs-Tools auf höherer Ebene kann Ihr Programm ohne Anstrengung optimiert werden.
Verwenden Sie mehr gleichzeitige Sets und weniger synchronisierte Sets. Dies ist ein weiterer, leicht zu befolgender Best Practice. Gleichzeitige Sets sind skalierbarer als synchronisierte Sets, daher ist die Verwendung gleichzeitiger Sets besser für die gleichzeitige Programmierung. Wenn Sie die Karte beim nächsten Mal verwenden müssen, sollten Sie zunächst über die Verwendung von Concurrenthashmap nachdenken. Mein Artikel Java Concurrent Collections hat eine detailliertere Beschreibung.
51) Wie kann man das Start eines Fadens erzwingen?
Dieses Problem ist wie die Erzwingung der Java -Müllsammlung. Es gibt noch keine Möglichkeit, es zu tun. Obwohl Sie System.gc () verwenden können, um die Müllsammlung durchzuführen, ist es nicht garantiert, dass es erfolgreich ist. Es gibt keine Möglichkeit, einen Thread zu zwingen, in Java zu beginnen. Er wird vom Thread Scheduler gesteuert und Java veröffentlicht die entsprechende API nicht.
52) Wie lautet das Fork -Join -Framework in Java?
fork join 框架是JDK7 中出现的一款高效的工具,Java 开发人员可以通过它充分利用现代服务器上的多处理器。它是专门为了那些可以递归划分成许多子模块设计的,目的是将所有可用的处理能力用来提升程序的性能。fork join 框架一个巨大的优势是它使用了工作窃取算法,可以完成更多任务的工作线程可以从其它线程中窃取任务来执行。你可以查看这篇文章获得更多信息。
53) Java 多线程中调用wait () 和sleep ()方法有什么不同?
Java 程序中wait 和sleep 都会造成某种形式的暂停,它们可以满足不同的需要。wait ()方法用于线程间通信,如果等待条件为真且其它线程被唤醒时它会释放锁,而sleep ()方法仅仅释放CPU 资源或者让当前线程停止执行一段时间,但不会释放锁。你可以查看这篇文章获得更多信息。