Ich habe gerade aus Suns Dokument gelernt, dass beim Aufruf der thread.stop() -Methode die run() -Methode beendet wird, wenn der ThreadDeath-Fehler ausgelöst wird, und auch alle Sperren dieses Threads freigibt, wie kann man es beweisen?Warum thread.stop() nicht funktioniert?
versuchte ich mein Testprogramm, unten gezeigt:
public static void main(String[] args) {
final Object lock = new Object();
try {
Thread t = new Thread() {
public synchronized void run() {
try {
synchronized (lock) {
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++)
System.out.println("runing.." + i);
System.out
.println((System.currentTimeMillis() - start)/1000);
}
} catch (Throwable ex) {
System.out.println("Caught in run: " + ex);
ex.printStackTrace();
}
}
};
t.start();
// Give t time to get going...
Thread.sleep(100);
t.stop(); // EXPECT COMPILER WARNING
} catch (Throwable t) {
System.out.println("Caught in main: " + t);
t.printStackTrace();
}
}
Nur wenn ich eine Wartezeit setzen() in der Methode run(), dann kann ich den Thread Fehler fangen, weiß jemand die Details, wie jvm handle stop()?
public static void main(String[] args) {
final Object lock = new Object();
try {
Thread t = new Thread() {
public synchronized void run() {
try {
synchronized (lock) {
wait();
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++)
System.out.println("runing.." + i);
System.out
.println((System.currentTimeMillis() - start)/1000);
}
} catch (Throwable ex) {
System.out.println("Caught in run: " + ex);
ex.printStackTrace();
}
}
};
t.start();
// Give t time to get going...
Thread.sleep(100);
t.stop(); // EXPECT COMPILER WARNING
} catch (Throwable t) {
System.out.println("Caught in main: " + t);
t.printStackTrace();
}
}
unwahr, die Synchronisierung. ist auf einem beliebigen Sperrobjekt. Der wahre Grund - der Thread wird normal beendet. – bestsss