public class Test {
private static final String DATE_PATTERN = "HH:mm:ss.SSS";
public static FastDateFormat DATE_FORMAT = FastDateFormat.getInstance(DATE_PATTERN);
public static String time() {
return DATE_FORMAT.format(new Date());
}
public static void doSleep(long ms) {
try {
Thread.sleep(ms);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread() {
@Override
public void run() {
System.out.println(time() + " T: sleep(2000)");
doSleep(2000);
System.out.println(time() + " T: sleep(2000) finished");
System.out.println(time() + " T: sync");
synchronized (this) {
System.out.println(time() + " T: sleep(60000)");
doSleep(60000);
System.out.println(time() + " T: sleep(60000) finished");
}
System.out.println(time() + " T: finished");
}
};
System.out.println(time() + " M: t.start()");
t.start();
System.out.println(time() + " M: t.join(5000)");
t.join(5000);
System.out.println(time() + " M: finished");
}
}
thoughts, ideas, tips&tricks - all around the Java programming language and JEE technologies
Dienstag, 13. Dezember 2011
When the timeout fails in Thread.join
There is a little danger using the join with a timeout. The implementation will call a wait on the thread instance. For this purpose the calling thread A has to get the monitor on the thread B he wants to join. During the wait this monitor is suspended, but after the wait the thread has to enter the monitor again. If now the thread B obtains the monitor itself and holds it for a long time (forever), the timeout of the wait method (inside the join) may be finished, but the monitor can not be regained after the wait. Therefore the thread A will stuck in the join method for a long time (forever) even with the timeout...
Abonnieren
Kommentare zum Post (Atom)
Keine Kommentare:
Kommentar veröffentlichen