Я создал два потока, не являющихся демонами, которые завершатся раньше, чем остальные два потока демонов.
Один поток, не являющийся демоном, ожидает в течение 20 секунд, один поток демона ожидает 40 секунд, один поток, не являющийся демономсон в течение 15 секунд, один поток демона спит в течение 30 секунд, один поток демона спит в течение 10 секунд.Идея завершить потоки, не являющиеся демонами, перед некоторыми демонами.
Как следует из результата, JVM завершит работу, как только не останется живого потока, не являющегося демоном, без выполнения операторов rest в задачах Runnableпотоки демона, даже если они находятся внутри блока finally, не генерируют исключение InterruptedException.
public class DeamonTest {
public static void main(String[] args) {
spawn(40000, Action.wait, true);
spawn(30000, Action.sleep, true);
spawn(10000, Action.sleep, true);
spawn(20000, Action.wait, false);
spawn(15000, Action.sleep, false);
}
enum Action {
wait, sleep
}
private static void spawn(final long time, final Action action,
boolean daemon) {
final Thread thread = new Thread(new Runnable() {
@Override
public void run() {
Thread thread = Thread.currentThread();
try {
switch (action) {
case wait: {
synchronized (this) {
System.out.println(thread + " daemon="
+ thread.isDaemon() + ": waiting");
wait(time);
}
break;
}
case sleep: {
System.out.println(thread + " daemon="
+ thread.isDaemon() + ": sleeping");
Thread.sleep(time);
}
}
System.out.println(thread + " daemon=" + thread.isDaemon()
+ ": exiting");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println(thread + " daemon=" + thread.isDaemon()
+ ": finally exiting");
}
}
});
thread.setDaemon(daemon);
thread.start();
}
}