Heim >Java >JavaInterview Fragen >Interviewer: Könnten Sie mir bitte die Unterschiede zwischen Sleep(), Wait(), Join() und Yield() erklären?
Lassen Sie uns zunächst die Konzepte des Lock-Pools und des Wartepools vorstellen.
Schauen wir uns zunächst das Konzept des Sperrpools an.
Alle Threads, die um Synchronisierungssperren konkurrieren müssen, werden in den Sperrpool eingefügt. Beispielsweise wurde die Sperre des aktuellen Objekts von einem der Threads und einem anderen erhalten Threads müssen in diesem Sperrpool warten. Nachdem der Thread unten die Synchronisierungssperre freigegeben hat, konkurrieren die Threads im Sperrpool um die Synchronisierungssperre. Wenn ein Thread diese erhält, tritt er in die Bereitschaftswarteschlange ein und wartet auf die Zuweisung von CPU-Ressourcen.
Werfen wir einen Blick auf das Konzept des Wartepools
Wenn wir die Methode wait() aufrufen, wird der Thread im Wartepool platziert und die im Pool wartenden Threads konkurrieren nicht um Synchronisationssperren. Erst nach dem Aufruf von notify() oder notifyAll() beginnen die Threads im Wartepool, um die Sperre zu konkurrieren. notify() wählt zufällig einen Thread aus dem Wartepool aus und fügt ihn in den Sperrpool ein, während notifyAll() alle Threads einfügt im Wartepool Legen Sie es in den Sperrpool.
sleep ist eine statische lokale Methode der Thread-Klasse und wait ist eine lokale Methode von Object.
Die Schlafmethode gibt die Sperre nicht frei, aber das Warten gibt sie frei und fügt sie der Warteschlange hinzu.
sleep就是把cpu的执行资格和执行权释放出去,不再运行此线程,当定时事件结束再取回cpu资源,参与cpu的调度,获取到cpu资源后就可以继续运行了,而如果sleep时该线程有锁,那么sleep不会释放这个锁,而是把锁带着进入了冻结状态,也就是说其它需要这个锁的线程根本不可能获取到这个锁。也就是说无法执行程序,如果在睡眠期间其它线程调用了这个线程的interrupt方法,那么这个线程也会抛出interruptexception异常返回,这点和wait是一样的。
Die Schlafmethode hängt nicht vom synchronisierten Synchronisierer ab, aber warten muss vom synchronisierten Schlüsselwort abhängen.
Schlaf muss nicht geweckt werden (beendet die Funktion nach dem Schlafen und wird blockiert), Warten jedoch schon (es muss nicht zu einer bestimmten Zeit von anderen unterbrochen werden).
sleep wird im Allgemeinen zum Ruhen des aktuellen Threads oder zum Abfragen und Anhalten von Vorgängen verwendet, während wait hauptsächlich für die Kommunikation zwischen mehreren Threads verwendet wird.
sleep gibt CPU-Ausführungszeit auf und erzwingt einen Kontextwechsel, aber warten wird dies nicht unbedingt tun. Nach dem Warten besteht möglicherweise immer noch die Möglichkeit, erneut um die Sperre zu konkurrieren und die Ausführung fortzusetzen.
yield() Nach der Ausführung wechselt der Thread direkt in den Bereitschaftszustand und gibt sofort das Ausführungsrecht der CPU frei, behält aber weiterhin die Ausführungsqualifikation der CPU bei, sodass es möglich ist, dass die CPU beim nächsten Mal eine Thread-Planung durchführt , erhält dieser Thread das Ausführungsrecht.
(Lernvideo-Sharing: Java-Video-Tutorial)
Nachdem join() ausgeführt wurde, wechselt der Thread in den Blockierungsstatus. Wenn beispielsweise join() von Thread A in Thread B aufgerufen wird, tritt Thread B in den Blockierungsstatus ein Warteschlange und Leitfaden A. Beenden oder unterbrechen Sie den Thread.
public static void main(String[] args) throws InterruptedException { Thread t1=new Thread(()->{ try { Thread.sleep(4000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("休眠sleep线程"); }); t1.start(); t1.join(); System.out.println("线程执行完成"); }
Originallink: https://blog.csdn.net/lxn1023143182/article/details/114134498
Verwandte Empfehlungen: Fragen und Antworten zu Java-Interviews
Das obige ist der detaillierte Inhalt vonInterviewer: Könnten Sie mir bitte die Unterschiede zwischen Sleep(), Wait(), Join() und Yield() erklären?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!