For starters, this can easily be implementation-dependent. I just ran the code a few times, and mostly the "Main exits" message was the last to be printed, but a couple of times in between the others.
As the worker thread is running with the same priority, worker thread should finish first
No. Both threads have the same priority, so it's up to the JVM to decide which one to run. Pre-emptive
means that thread execution can be put on hold in favor of running some other thread, and then resumed later.
What's more, calling t.start() does not guarantee that the thread starts executing right then. It very likely starts no later than the sleep method call, but the JVM might decide that 10ns is so short that swapping in a different thread is not worth the effort, and continues running the main thread for some more time. Or maybe it calls the GC during that time.
Plus, the JVM may or may not run threads on different CPU cores, so there may be actual parallelism at work (or not, you can't be sure).
And lastly, even though it plays no role here: Thread priorities are not something one should put a lot of stock in. In particular, trying to control which threads are run by giving them different priorities is bound not to work well. It seems like it should, but it just doesn't.