121, was ist ein Thread?能 Der Thread ist die kleinste Einheit für Betriebssysteme zur Durchführung der Betriebsplanung. Er ist in den Prozess eingebunden und die eigentliche Betriebseinheit im Prozess. Programmierer können es für die Multiprozessorprogrammierung verwenden, und Sie können Multithreading verwenden, um rechenintensive Aufgaben zu beschleunigen. Wenn es beispielsweise 100 Millisekunden dauert, bis ein Thread eine Aufgabe erledigt, dann dauert es nur 10 Millisekunden, bis zehn Threads die Aufgabe erledigt haben.
(Weitere verwandte Empfehlungen zu Interviewfragen:
Java-Interviewfragen und -antworten)122, was ist der Unterschied zwischen Threads und Prozessen?
Threads sind eine Teilmenge von Prozessen. Ein Prozess kann viele Threads haben und jeder Thread führt unterschiedliche Aufgaben parallel aus. Verschiedene Prozesse nutzen unterschiedliche Speicherplätze und alle Threads teilen sich denselben Speicherplatz. Jeder Thread verfügt über einen separaten Stapelspeicher zum Speichern lokaler Daten.
123, Wie implementiert man Threads in Java? V Zwei Möglichkeiten: Die Instanz der Klasse java.lang.thread ist ein Thread, muss jedoch zur Ausführung die Schnittstelle java.lang.runnable aufrufen. Da die Thread-Klasse selbst als ausführbare Schnittstelle bezeichnet wird, können Sie Java erben. lang.thread-Klasse oder rufen Sie direkt die Runnable-Schnittstelle auf, um die run()-Methode zum Implementieren von Threads zu überschreiben.
124, Was sind die Funktionen und Unterschiede zwischen den Java-Schlüsselwörtern volatile und synchronisiert?
1. volatile Die von ihr geänderte Variable behält keine Kopie und greift direkt auf den Hauptspeicher zu.
Im Java-Speichermodell gibt es einen Hauptspeicher und jeder Thread verfügt auch über einen eigenen Speicher (z. B. Register). Aus Leistungsgründen behält ein Thread eine Kopie der Variablen, auf die er zugreift, in seinem eigenen Speicher. Auf diese Weise kann es zu Situationen kommen, in denen der Wert derselben Variablen im Speicher eines Threads zu einem bestimmten Zeitpunkt möglicherweise nicht mit dem Wert im Speicher eines anderen Threads oder dem Wert im Hauptspeicher übereinstimmt. Das Deklarieren einer Variablen als flüchtig bedeutet, dass die Variable jederzeit von anderen Threads geändert werden kann und daher nicht im Thread-Speicher zwischengespeichert werden kann.
Wenn es zum Ändern einer Methode oder eines Codeblocks verwendet wird, kann sichergestellt werden, dass höchstens ein Thread den Code gleichzeitig ausführt.
1. Wenn zwei gleichzeitige Threads auf den synchronisierten (diesen) Synchronisationscodeblock im selben Objektobjekt zugreifen, kann jeweils nur ein Thread ausgeführt werden. Ein anderer Thread muss warten, bis der aktuelle Thread die Ausführung dieses Codeblocks abgeschlossen hat, bevor er diesen Codeblock ausführen kann.
2. Wenn jedoch ein Thread auf einen synchronisierten (diesen) synchronisierten Codeblock des Objekts zugreift, kann ein anderer Thread immer noch auf den nicht synchronisierten (diesen) synchronisierten Codeblock im Objekt zugreifen. Schritt 3. Insbesondere wenn ein Thread auf einen synchronisierten (diesen) Synchronisationscodeblock von Object zugreift, werden andere Threads zu allen anderen synchronisierten (diesen) Synchronisationscodeblöcken in Object blockiert.
4. Wenn ein Thread auf einen synchronisierten (diesen) Synchronisationscodeblock eines Objekts zugreift, erhält er die Objektsperre dieses Objekts. Dadurch wird der Zugriff anderer Threads auf alle synchronisierten Codeteile des Objektobjekts vorübergehend blockiert.
5. Die oben genannten Regeln gelten auch für andere Objektsperren
125, was sind die unterschiedlichen Thread-Lebenszyklen?
Wenn wir in einem Java-Programm einen neuen Thread erstellen, ist sein Status „Neu“. Wenn wir die start()-Methode des Threads aufrufen, wird der Status in Runnable geändert. Der Thread-Scheduler weist den Threads im ausführbaren Thread-Pool CPU-Zeit zu und ändert ihren Status in „Wird ausgeführt“. Andere Thread-Status sind „Wartend“, „Blockiert“ und „Tot“.
126, was verstehen Sie unter Thread-Priorität?是 Jeder Thread hat Priorität. Im Allgemeinen haben Threads mit hoher Priorität Priorität, dies hängt jedoch von der Implementierung der Thread-Planung ab. Diese Implementierung hängt vom Betriebssystem ab (OS-abhängig). Wir können die Priorität von Threads definieren, aber das garantiert nicht, dass Threads mit hoher Priorität vor Threads mit niedriger Priorität ausgeführt werden. Die Thread-Priorität ist eine int-Variable (von 1 bis 10), 1 steht für die niedrigste Priorität, 10 für die höchste Priorität.
127, was ist ein Deadlock? Wie kann man Deadlocks analysieren und vermeiden?
Deadlock bezieht sich auf eine Situation, in der mehr als zwei Threads für immer blockiert sind. Diese Situation erfordert mindestens zwei oder mehr Threads und mehr als zwei Ressourcen.
um den Thread-Dump der Java-Anwendung anzusehen. Wir müssen herausfinden, welche Threads sich im Status BLOCKED befinden und auf welche Ressourcen sie warten. Jede Ressource hat eine eindeutige ID. Mithilfe dieser ID können wir herausfinden, welche Threads ihre Objektsperre bereits besitzen.
Das Vermeiden verschachtelter Sperren, die Verwendung von Sperren nur bei Bedarf und das Vermeiden unbegrenzter Wartezeiten sind gängige Methoden zur Vermeidung von Deadlocks.
128, Was ist Thread-Sicherheit? Ist Vector eine Thread-sichere Klasse?
Wenn in dem Prozess, in dem sich Ihr Code befindet, mehrere Threads gleichzeitig ausgeführt werden, führen diese Threads diesen Code möglicherweise gleichzeitig aus. Wenn die Ergebnisse jedes Laufs mit denen von Single-Thread-Läufen übereinstimmen und die Werte anderer Variablen mit den Erwartungen übereinstimmen, ist dies Thread-sicher. Eine Thread-sichere Zählerklasse verursacht keine Berechnungsfehler, wenn dasselbe Instanzobjekt von mehreren Threads verwendet wird. Natürlich können Sie Sammlungsklassen in zwei Gruppen einteilen: Thread-sichere und nicht Thread-sichere. Vector verwendet synchronisierte Methoden, um Thread-Sicherheit zu erreichen, während ArrayList, das ihm ähnlich ist, nicht Thread-sicher ist.
(Empfehlung für ein entsprechendes Video-Tutorial:
Java-Kurs)129, Wie stoppe ich einen Thread in Java?
Java bietet eine sehr umfangreiche API, jedoch keine API zum Stoppen von Threads. JDK 1.0 verfügte ursprünglich über einige Steuerungsmethoden wie stop(), suspend() und resume(), diese wurden jedoch in nachfolgenden JDK-Versionen aufgrund potenzieller Deadlock-Bedrohungen veraltet. Danach stellten die Entwickler der Java-API keine kompatiblen und Thread-basierten Methoden zur Verfügung. sichere Möglichkeit, einen Thread zu stoppen. Der Thread wird automatisch beendet, wenn die Methode run() oder call() ausgeführt wird. Wenn Sie einen Thread manuell beenden möchten, können Sie eine flüchtige boolesche Variable verwenden, um die Schleife der run()-Methode zu verlassen oder die Aufgabe abzubrechen, um den Thread zu unterbrechen
130, Was ist ThreadLocal? ThreadLocal wird zum Erstellen lokaler Variablen von Threads verwendet. Wir wissen, dass alle Threads eines Objekts seine globalen Variablen gemeinsam nutzen, sodass diese Variablen nicht threadsicher sind. Wenn wir jedoch keine Synchronisierung verwenden möchten, können wir ThreadLocal-Variablen auswählen.
Jeder Thread hat seine eigenen Thread-Variablen. Sie können die Methode get()set() verwenden, um ihre Standardwerte abzurufen oder ihre Werte innerhalb des Threads zu ändern. ThreadLocal-Instanzen möchten normalerweise, dass der zugehörige Thread-Status private statische Eigenschaften ist.
131, Was sind die Unterschiede zwischen Sleep(), suspend() und wait()?
Thread.sleep() versetzt den aktuellen Thread zum angegebenen Zeitpunkt in den Status „Nicht ausführbar“. Der Thread enthält immer den Monitor des Objekts. Wenn sich beispielsweise ein Thread derzeit in einem synchronisierten Block oder einer synchronisierten Methode befindet, können andere Threads den Block oder die Methode nicht betreten. Wenn ein anderer Thread die Methode interrupt() aufruft, wird der „schlafende“ Thread aufgeweckt.
\u003d Hinweis: Sleep() ist eine statische Methode. Dies bedeutet, dass es nur für den aktuellen Thread gültig ist. Ein häufiger Fehler besteht darin, t.sleep() aufzurufen (wobei t ein anderer Thread als der aktuelle Thread ist). Auch wenn t.sleep() ausgeführt wird, geht der aktuelle Thread in den Ruhezustand, nicht der t-Thread. t.suspend() ist eine veraltete Methode. Die Verwendung von suspend() führt dazu, dass der Thread den Monitor des Objekts immer hält.
object.wait() versetzt den aktuellen Thread in einen „nicht ausführbaren“ Zustand. Der Unterschied zu sleep(). ist, dass Wait eine Objektmethode und kein Thread ist. Beim Aufruf von object.wait() muss der Thread zuerst die Objektsperre dieses Objekts erwerben. Der aktuelle Thread muss die Synchronisierung für das Sperrobjekt aufrechterhalten und den aktuellen Thread zur Warteschlange hinzufügen. Dann kann ein anderer Thread dieselbe Objektsperre synchronisieren Rufen Sie das Objekt notify() auf, das den ursprünglich wartenden Thread aufweckt und dann die Sperre aufhebt. Im Grunde ähnelt wait()/notify() Sleep()/interrupt(), außer dass ersteres die Objektsperre erwerben muss.
132, was ist Thread-Starvation und was ist Livelock?
Wenn alle Threads blockiert sind oder nicht verarbeitet werden können, weil die erforderlichen Ressourcen ungültig sind, gibt es keine nicht blockierenden Threads, um die Ressourcen verfügbar zu machen. Thread-Livelock in der Java-API kann in den folgenden Situationen auftreten: 1. Wenn alle Threads Object.wait(0) im Programm ausführen, wird die Wartemethode mit Parameter 0 verwendet. Das Programm führt eine Live-Sperre durch, bis ein Thread Object.notify() oder Object.notifyAll() für das entsprechende Objekt aufruft.
2. Wenn alle Threads in einer Endlosschleife stecken bleiben.
133, Was ist die Java-Timer-Klasse? Wie erstelle ich eine Aufgabe mit einem bestimmten Zeitintervall?
java.util.Timer ist eine Toolklasse, mit der ein Thread so geplant werden kann, dass er zu einem bestimmten Zeitpunkt in der Zukunft ausgeführt wird. Mit der Timer-Klasse können einmalige oder periodische Aufgaben geplant werden.
java.util.TimerTask ist eine abstrakte Klasse, die die Runnable-Schnittstelle implementiert. Wir müssen diese Klasse erben, um unsere eigenen geplanten Aufgaben zu erstellen und Timer zum Planen ihrer Ausführung zu verwenden.
134. Was ist der Unterschied zwischen synchronisierten Sammlungen und gleichzeitigen Sammlungen in Java?
Sowohl synchronisierte Sammlungen als auch gleichzeitige Sammlungen bieten geeignete threadsichere Sammlungen für Multithreading und Parallelität, gleichzeitige Sammlungen sind jedoch skalierbarer.
.
Java5 führte gleichzeitige Sammlungen wie ConcurrentHashMap ein, die nicht nur Thread-Sicherheit bieten, sondern auch die Skalierbarkeit mit modernen Technologien wie Sperrentrennung und interner Partitionierung verbessern.
135, Synchronisationsmethode oder Synchronisationsblock, welche ist die bessere Wahl?
Der synchronisierte Block ist eine bessere Wahl, da er nicht das gesamte Objekt sperrt (natürlich können Sie auch das gesamte Objekt sperren lassen). Synchronisierte Methoden sperren das gesamte Objekt, auch wenn die Klasse mehrere unabhängige synchronisierte Blöcke enthält, was normalerweise dazu führt, dass sie nicht mehr ausgeführt werden und warten müssen, bis die Sperre für das Objekt erhalten wird.
136, Was ist ein Thread-Pool? Warum es verwenden?费 Das Erstellen von Threads erfordert teure Ressourcen und Zeit. Wenn die Aufgabe ansteht, wird sie länger und die Anzahl der Threads, die in einem Prozess erstellt werden können, ist begrenzt.
Um diese Probleme zu vermeiden, werden eine Reihe von Threads erstellt, die beim Start des Programms auf die Verarbeitung reagieren. Sie werden Thread-Pools genannt und die Threads darin werden Arbeitsthreads genannt.
Ab JDK1.5 stellt die Java API das Executor-Framework bereit, damit Sie verschiedene Thread-Pools erstellen können. Beispielsweise verarbeitet ein einzelner Thread-Pool jeweils eine Aufgabe; eine feste Anzahl von Thread-Pools oder ein Cache-Thread-Pool (ein skalierbarer Thread-Pool, der für Programme mit vielen kurzlebigen Aufgaben geeignet ist).
137, Was ist der Unterschied zwischen invokeAndWait und invokeLater in Java?
Diese beiden Methoden werden von der Swing-API für Java-Entwickler bereitgestellt, um GUI-Komponenten aus dem aktuellen Thread statt aus dem Event-Dispatch-Thread zu aktualisieren. InvokeAndWait() aktualisiert GUI-Komponenten, wie zum Beispiel einen Fortschrittsbalken, synchron. Sobald der Fortschritt aktualisiert ist, muss sich auch der Fortschrittsbalken entsprechend ändern. Wenn der Fortschritt von mehreren Threads verfolgt wird, rufen Sie die Methode invokeAndWait() auf, um den Event-Dispatch-Thread aufzufordern, die Komponente entsprechend zu aktualisieren. Die Methode invokeLater() ruft die Update-Komponente asynchron auf.
138, Was ist eine Besetztschleife beim Multithreading?
Eine Besetztschleife liegt vor, wenn der Programmierer eine Schleife verwendet, um einen Thread warten zu lassen, im Gegensatz zu den herkömmlichen Methoden wait(), sleep() oder yield() CPU-Steuerung hochfahren. Eine Busy-Schleife gibt die CPU nicht auf, sondern führt lediglich eine leere Schleife aus. Der Zweck besteht darin, den CPU-Cache zu schonen.
Es kann verwendet werden, um einen Neuaufbau des Caches zu vermeiden und die Wartezeit für den Neuaufbau zu verkürzen.
Verwandte Empfehlungen:
Java-Einführungs-TutorialDas obige ist der detaillierte Inhalt vonFragen zum Java-Multithreading-Interview. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!