Try this:
import threading
help(threading.Thread)
then scroll down to the documentation of the data descriptors, in particular the "daemon" flag. There, you will find this info:
daemon
A boolean value indicating whether this thread is a daemon thread.
This must be set before start() is called, otherwise RuntimeError is
raised. Its initial value is inherited from the creating thread; the
main thread is not a daemon thread and therefore all threads created in
the main thread default to daemon = False.
The entire Python program exits when no alive non-daemon threads are
left.
In particular the last sentence is important, because all your questions are implicitly answered by that. Note also that this contradicts your first claim that "non daemon thread exits when main thread exit". Also, other languages behave differently, for example your reference to Java may be true, but useless to explain Python behaviour. Checking the documentation, it seems that Java uses the term "daemon thread" exactly as Python does.