We have discussed that to call a thread we need to create an instance of this thread and call the start() method. But this raises the question, who does this for the very first thread in the Java application? Which thread calls the start() method of the very first thread?
This is apparently the chicken-egg problem π but if we go a little deeper, we will find that a thread object is a mere representation of a thread in the program, it does not have information about call stacks and program counter. It only serves as a storage for a pointer to lower level mechanisms that implement threads. Thus, JVM is capable of creating threads without using the Thread class and the thread object can be created later if needed.
This is apparently the chicken-egg problem π but if we go a little deeper, we will find that a thread object is a mere representation of a thread in the program, it does not have information about call stacks and program counter. It only serves as a storage for a pointer to lower level mechanisms that implement threads. Thus, JVM is capable of creating threads without using the Thread class and the thread object can be created later if needed.
How does JVM create "main" thread?
An instance of java.lang.Thread is not a thread; it can be used to represent a thread of execution in the JVM but the JVM is perfectly capable of creating threads without using the Thread class at all.
This is what happens with the main thread: the JVM creates it, and an instance of java.lang.Thread is created to represent it later.
Following is based on the code present in the Hotspot JVM.
The startup of the JVM calls the static Threads::create_vm function, which is already running in a thread set up by the operating system. Within that function we find:
Let's discuss this code -
The startup of the JVM calls the static Threads::create_vm function, which is already running in a thread set up by the operating system. Within this function, we find main_thread of C++ class type JavaThread is created and is set with the initial state.
The JavaThread class is apparently used for bookkeeping; it associates an OS or VM thread with a Java Thread object. The Java object apparently doesn't exist yet. The code then goes on to initialize various other things. In other words, it initializes the System, ThreadGroup, and Thread classes then create an instance of Thread referenced by thread_object and set the Thread instance for the main JavaThread.
If you wonder what the create_initial_thread does, apparently it allocates the Thread instance, stores a pointer to the JavaThread (C++) object in the private eetop field of the Thread instance, sets the thread priority field to normal, calls the Thread(ThreadGroup group, String name) constructor, and returns the instance:
Now, this is what Hotspot VM does. Other implementations probably do something like this (source).
The JavaThread class is apparently used for bookkeeping; it associates an OS or VM thread with a Java Thread object. The Java object apparently doesn't exist yet. The code then goes on to initialize various other things. In other words, it initializes the System, ThreadGroup, and Thread classes then create an instance of Thread referenced by thread_object and set the Thread instance for the main JavaThread.
If you wonder what the create_initial_thread does, apparently it allocates the Thread instance, stores a pointer to the JavaThread (C++) object in the private eetop field of the Thread instance, sets the thread priority field to normal, calls the Thread(ThreadGroup group, String name) constructor, and returns the instance:
Now, this is what Hotspot VM does. Other implementations probably do something like this (source).
Main Thread
When a Java program starts up, the main thread begins running immediately and it is the thread from which other children threads are spawned.
How to control the main thread?
To do this, we must take the reference of the main thread using the currentThread() method. This method returns the reference of the thread on which it is called. The default priority of the main thread is 5 and for all remaining threads, the priority is inherited from the parent to the child.
Let's see the below code to understand this
Deadlock using main thread (single thread)
If we call join() method from the main method on the current thread then it will wait for itself and will cause deadlock. Below code represents how -
Woori Casino No Deposit Bonus 2021 | Free Play in Demo
ReplyDeleteWoori Casino offers a variety of free spins and no deposit bonuses, https://octcasino.com/ as well as regular promotions. https://septcasino.com/review/merit-casino/ As casino-roll.com you jancasino.com can't claim this offer without μΆμ₯λ§μ¬μ§ being registered