В случаях, когда вы используете System.exit (). Все потоки остановятся независимо от того, являются ли они демонами.
В противном случае JVM автоматически остановит все потоки, которые являются потоками демонов, установленными Thread.setDaemon (true). Другими словами, jvm завершит работу, только когда все оставшиеся потоки являются потоками демона или вообще не имеют потоков.
Рассмотрим приведенный ниже пример, он продолжит работу даже после возврата из основного метода.
но если вы установите его в daemon, он прекратит работу, когда завершится основной метод (основной поток).
public class Test {
public static void main(String[] arg) throws Throwable {
Thread t = new Thread() {
public void run() {
while(true) {
try {
Thread.sleep(300);
System.out.println("Woken up after 300ms");
}catch(Exception e) {}
}
}
};
// t.setDaemon(true); // will make this thread daemon
t.start();
System.exit(0); // this will stop all threads whether are not they are daemon
System.out.println("main method returning...");
}
}