Non-daemon threads, or user threads, prevent the JVM from exiting if alive, while daemon threads do not. Daemon threads should be used cautiously, as they can lead to resource leaks if the JVM halts mid-execution, skipping finally blocks. Most JVM threads are daemon threads, inheriting from parent threads.