1. Welchen Status haben Threads?
Threads haben normalerweise fünf Zustände: erstellt, bereit, ausgeführt, blockiert und tot.
1. Erstellungsstatus
Beim Generieren eines Thread-Objekts wird die Startmethode des Objekts nicht aufgerufen. Dies bedeutet, dass sich der Thread im Erstellungsstatus befindet.
2. Bereitschaftszustand
Nach dem Aufruf der Startmethode des Thread-Objekts wechselt der Thread in den Bereitschaftszustand, aber zu diesem Zeitpunkt hat der Thread-Scheduler den Thread nicht als aktuellen Thread festgelegt. Es ist jetzt in einem betriebsbereiten Zustand. Nachdem der Thread ausgeführt wurde, befindet er sich auch nach der Rückkehr aus dem Warten oder Schlafen im Bereitschaftszustand.
3. Ausführungsstatus
Der Thread-Scheduler versetzt den Thread in den Bereitschaftsstatus als aktuellen Thread. Zu diesem Zeitpunkt wechselt der Thread in den Ausführungsstatus und beginnt mit der Ausführung des Codes in der Ausführungsfunktion .
4. Blockierungsstatus
Wenn ein Thread ausgeführt wird, wird er normalerweise angehalten, um eine bestimmte Zeit abzuwarten (z. B. wenn eine bestimmte Ressource bereit ist), bevor er weiter ausgeführt wird. Sleep, Suspend, Wait und andere Methoden können zum Blockieren von Threads führen.
5. Todeszustand
Wenn die Ausführungsmethode eines Threads endet oder die Stoppmethode aufgerufen wird, stirbt der Thread ab. Für einen Thread, der abgestorben ist, kann die Startmethode nicht mehr verwendet werden, um ihn vorzubereiten.
(Empfohlene verwandte Video-Tutorials: Java-Video)
2. Was ist der Unterschied zwischen sleep() und wait()?
1. Sleep(): Die Methode ist eine statische Methode der Thread-Klasse (Thread), die es dem aufrufenden Thread ermöglicht, in den Ruhezustand zu wechseln und anderen Threads Ausführungsmöglichkeiten zu geben ist vorbei, der Thread wird bereit. Der Zustand konkurriert mit anderen Threads um die CPU-Ausführungszeit. Da es sich bei Sleep() um eine statische Methode handelt, kann sie die Maschinensperre des Objekts nicht ändern. Wenn die Methode Sleep() in einem synchronisierten Block aufgerufen wird, wird die Maschinensperre des Objekts nicht aufgehoben, obwohl der Thread in den Ruhezustand wechselt, und andere Threads können dies immer noch nicht auf dieses Objekt zugreifen.
2. wait(): wait() ist eine Methode der Object-Klasse. Wenn ein Thread die Wartemethode ausführt, tritt er in einen Wartepool ein, der sich auf das Objekt bezieht, und gibt gleichzeitig die Maschinensperre des Objekts frei Um anderen Threads den Zugriff zu ermöglichen, können Sie wartende Threads über die Methoden notify und notifyAll aktivieren.
3. Was ist der Unterschied zwischen notify() und notifyAll()?
Wenn ein Thread die Methode wait() eines Objekts aufruft, befindet sich der Thread im Wartepool des Objekts und die Threads im Wartepool konkurrieren nicht um die Sperre des Objekts.
Wenn ein Thread die Methode notifyAll() des Objekts (weckt alle Warte-Threads auf) oder die Methode notify() (weckt zufällig nur einen Warte-Thread auf) aufruft, gelangt der aufgeweckte Thread in den Sperrpool des Objekts, die Threads im Sperrpool konkurrieren um die Objektsperre. Das heißt, nach dem Aufruf von notify betritt nur ein Thread den Sperrpool aus dem Wartepool, und notifyAll verschiebt alle Threads im Objektwartepool in den Sperrpool, um auf den Sperrwettbewerb zu warten.
Threads mit hoher Priorität konkurrieren mit hoher Wahrscheinlichkeit um die Objektsperre. Wenn ein Thread nicht um die Objektsperre konkurriert, bleibt er nur dann im Sperrpool, wenn der Thread die Methode wait() aufruft Wieder kann es in den Wartepool zurückkehren. Der Thread, der um die Objektsperre konkurriert, wird weiter ausgeführt, bis der synchronisierte Codeblock ausgeführt wird, und die Objektsperre aufheben. Zu diesem Zeitpunkt konkurrieren die Threads im Sperrpool weiterhin um die Objektsperre.
4. Was ist der Unterschied zwischen Thread run() und start()?
Jeder Thread schließt seine Operation über die Methode run() ab, die einem bestimmten Thread-Objekt entspricht. Die Methode run() wird als Thread-Körper bezeichnet. Starten Sie einen Thread, indem Sie die start()-Methode der Thread-Klasse aufrufen.
start()-Methode zum Starten eines Threads, wodurch ein Multithread-Betrieb wirklich realisiert wird. Zu diesem Zeitpunkt müssen Sie nicht auf die Ausführung des Hauptteilcodes der Ausführungsmethode warten. Sie können den folgenden Code zu diesem Zeitpunkt direkt ausführen. Der Thread befindet sich im Bereitschaftszustand und wird nicht ausgeführt. Rufen Sie dann die Methode run() über diese Thread-Klasse auf, um ihren Ausführungsstatus abzuschließen. Die Methode run() wird hier als Thread-Körper bezeichnet, der den Inhalt des auszuführenden Threads enthält. Die CPU plant dann andere Threads.
Die run()-Methode befindet sich in diesem Thread. Es handelt sich nur um eine Funktion im Thread, nicht um mehrere Threads. Wenn Sie run() direkt aufrufen, entspricht dies tatsächlich dem Aufruf einer normalen Funktion. Wenn Sie die run()-Methode direkt verwenden, müssen Sie warten, bis die run()-Methode die Ausführung abgeschlossen hat, bevor Sie den folgenden Code ausführen immer noch nur ein Ausführungspfad und es gibt überhaupt keine Thread-Eigenschaften, daher sollte bei der Multi-Thread-Ausführung die start()-Methode anstelle der run()-Methode verwendet werden.
(Empfohlenes Tutorial: Java Getting Started Program )
5. Welche Möglichkeiten gibt es, einen Thread-Pool zu erstellen?
1. newFixedThreadPool(int nThreads)
Erstellen Sie einen Thread-Pool mit fester Länge und erstellen Sie bei jeder Übermittlung einer Aufgabe einen Thread, bis die maximale Anzahl von Thread-Pools erreicht ist Dieses Mal ändert sich die Thread-Größe nicht mehr. Wenn ein Thread aufgrund eines unerwarteten Fehlers endet, fügt der Thread-Pool einen neuen Thread hinzu.
2. newCachedThreadPool()
Erstellen Sie einen zwischenspeicherbaren Thread-Pool, wenn die Größe des Thread-Pools den Verarbeitungsbedarf übersteigt. Bei steigendem Bedarf können neue Threads automatisch hinzugefügt werden .
3. newSingleThreadExecutor()
Dies ist ein Single-Threaded-Executor. Er erstellt einen einzelnen Arbeitsthread, um Aufgaben auszuführen ; Das Merkmal besteht darin, sicherzustellen, dass Aufgaben seriell gemäß der Reihenfolge in der Warteschlange ausgeführt werden.
4. newScheduledThreadPool(int corePoolSize)
Erstellt einen Thread-Pool fester Länge und führt Aufgaben verzögert oder geplant aus, ähnlich wie beim Timer.
Weitere Interviewfragen finden Sie in der Spalte Java-Interviewfragen.
Das obige ist der detaillierte Inhalt vonFragen zum neuen Java-Interview 2020 – Multithreading (2). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!