Ich habe das ausprobiert, Es ist single-threaded.
public static void main(String args[]) throws Exception {
Object obj = new Object();
try {
synchronized (obj) {
obj.wait();
System.out.println("nach wait()");
}
} catch (Exception ignored) {
} finally {
System.out.println("endlich");
}
}
Der main
Thread
wird für immer im wait
Zustand sein, daher wird finally
nie aufgerufen werden,
also wird die Konsolenausgabe nicht den String
drucken: nach wait()
oder finally
Zustimmung zu @Stephen C, das obige Beispiel ist einer der Fälle, die hier genannt werden:
Füge einige weitere solche Möglichkeiten für endlose Schleifen im folgenden Code hinzu:
// import java.util.concurrent.Semaphore;
public static void main(String[] args) {
try {
// Thread.sleep(Long.MAX_VALUE);
// Thread.currentThread().join();
// new Semaphore(0).acquire();
// while (true){}
System.out.println("nach sleep join semaphore exit infinite while loop");
} catch (Exception ignored) {
} finally {
System.out.println("endlich");
}
}
Fall 2: Wenn die JVM zuerst abstürzt
import sun.misc.Unsafe;
import java.lang.reflect.Field;
public static void main(String args[]) {
try {
unsafeMethod();
//Runtime.getRuntime().halt(123);
System.out.println("Nach dem JVM-Absturz!");
} catch (Exception e) {
} finally {
System.out.println("endlich");
}
}
private static void unsafeMethod() throws NoSuchFieldException, IllegalAccessException {
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
Unsafe unsafe = (Unsafe) f.get(null);
unsafe.putAddress(0, 0);
}
Ref: Wie lässt man eine JVM abstürzen?
Fall 6: Wenn der finally
Block von einem Daemon Thread
ausgeführt wird und alle anderen nicht-Daemon Threads
vor dem Aufruf von finally
beendet werden.
public static void main(String args[]) {
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
printThreads("Daemon Thread printing");
// just to ensure this thread will live longer than main thread
Thread.sleep(10000);
} catch (Exception e) {
} finally {
System.out.println("endlich");
}
}
};
Thread daemonThread = new Thread(runnable);
daemonThread.setDaemon(Boolean.TRUE);
daemonThread.setName("Mein Daemon-Thread");
daemonThread.start();
printThreads("main Thread Printing");
}
private static synchronized void printThreads(String str) {
System.out.println(str);
int threadCount = 0;
Set threadSet = Thread.getAllStackTraces().keySet();
for (Thread t : threadSet) {
if (t.getThreadGroup() == Thread.currentThread().getThreadGroup()) {
System.out.println("Thread :" + t + ":" + "Zustand:" + t.getState());
++threadCount;
}
}
System.out.println("Thread Count gestartet von Hauptthread:" + threadCount);
System.out.println("-------------------------------------------------");
}
Output: Dies gibt kein "finally" aus, was darauf hinweist, dass der "Finally-Block" im "Daemon-Thread" nicht ausgeführt wurde
main Thread Printing
Thread :Thread[Mein Daemon-Thread,5,main]:Zustand:BLOCKED
Thread :Thread[main,5,main]:Zustand:RUNNABLE
Thread :Thread[Monitor Ctrl-Break,5,main]:Zustand:RUNNABLE
Thread Count gestartet von Hauptthread:3
-------------------------------------------------
Daemon Thread printing
Thread :Thread[Mein Daemon-Thread,5,main]:Zustand:RUNNABLE
Thread :Thread[Monitor Ctrl-Break,5,main]:Zustand:RUNNABLE
Thread Count gestartet von Hauptthread:2
-------------------------------------------------
Prozess beendet mit Exit-Code 0
672 Stimmen
Wenn dies nicht der Fall ist, sollte das Schlüsselwort wie folgt lauten
probably
stattdessen.61 Stimmen
Nicht siempre
3 Stimmen
Effektives Java sagt etwas anderes informit.com/articles/article.aspx?p=1216151&seqNum=7
38 Stimmen
@BinoyBabu, Abschlussbericht !=
finally
; Abschlussbericht \== diefinalize()
Methode.5 Stimmen
@Boann Richtig, "nicht immer" in der Tat. Aber dann können Sie nie und nimmer die Worte "garantiert" oder "immer" verwenden.
2 Stimmen
@Boann Ich würde es so formulieren: Der Ausführungsfluss geht immer durch finally, bevor er die try-finally-Struktur verlässt. Wenn er darin stirbt, ist das für mich in Ordnung, denn der Hauptzweck von finally ist es, sicherzustellen, dass die Dinge für andere Teile des Codes nicht durcheinander gebracht werden.
0 Stimmen
Sieht aus, als hättest du da einen ganz schönen Fisch gefangen!
0 Stimmen
Wenn die
finally
Block einen Wert zurückgibt, dann kann der try/catch-Block nicht zurückkehren.0 Stimmen
@NoonSilk Das war saukomisch!