A THREAD is a single sequential
flow of control within a program. 
-  All Java programs have at least one thread, known as the main thread, 
which is created by the JVM at the program’s start, when the main() 
method is invoked with the main thread
 
PROCESS vs THREAD 
A
                  
process
                  runs independently and isolated of
                  other processes. It
                  cannot
                  directly
                  access
                  shared data in other processes. The
                  resources of
                  the
                  process, e.g.
                  memory
                  and CPU time, are
                  allocated to it via the
                  operating
                  system.
                  
               
               
                  A
                  
thread
                  is a
                  so called lightweight process. It has its own
                  call stack but
                  can
                  access shared data of other threads in the same process. Every
                  thread
                  has its own
                  memory cache. If a
                  thread
                  reads shared data it
                  stores
                  this
                  data in
                  its own memory cache.
                  A thread
                  can re-read the
                  shared
                  data.
Example:
The HotJava Web browser is an example of a multithreaded application.
Within the HotJava browser you can scroll a page while it's downloading
an applet or image, play animation and sound concurrently, print
a page in the background while you download a new page, or watch
three sorting algorithms race to the finish.
How to Create a Thread!
- creating a thread is accomplished by implementing an interface and 
extending a class. 
 
- Every Java thread is created and controlled by the 
java.lang.Thread class. 
 
- When a thread is created, it is assigned a priority. 
 
- The thread with 
higher priority is executed first, followed by lower-priority threads. 
 
The JVM stops executing threads under either of the following conditions:
- If the exit method has been invoked and authorized by the security manager.
 
- All the daemon threads of the program have died.
 
Types
Multithread 
Java is a multithreaded application that allows multiple thread 
execution at any particular time.
Single Thread 
In a single-threaded application, only
 one thread is executed at a time because the application or program can
 handle only one task at a time. 
Properties
- Thread id
 
Each thread has a unique ID (int value) which is provided by either the runtime or 
the OS; this is very helpful when you want to get the actual reference by.
- Thread name
 
A name for the thread, it could be the same through many threads, also could be empty. 
It's useful to categorize threads belonging to a specific module or task.
- Thread State
 
The current state of the thread. The state of a thread is determined by the State enumeration, 
and a thread state could be one of the following:

 
- Runnable: indicates that the thread has started and is running its task.
 
- New: indicates the thread has been created, but hasn't invoked (started) yet; when you just create an instance of 
the thread and haven't attempted invoke the 
start(). 
- Blocked: when a thread is in running state and is blocked because 
it is waiting for locking a resource which has 
been locked by another thread.
 
- Waiting: when the thread is idle and is waiting for a signal (notify).
 
- Timed_Waiting: when the thread is sleeping for an amount of time or is waiting for a signal from any another thread with 
timeout.
 
- Terminated: when a thread either has finished its job, note that a terminated thread would not start over from 
the beginning, and it's ready for finalizing. 
 
- Interrupted: this indicates if an interrupt signal has 
been sent to the thread or not, note that this is not an actual state, a thread would get interrupted when it's in either running or waiting states 
(not in new and terminated states). You cannot get the interrupt state by 
the State enumeration.
 
- Dead: when thread A is waiting for a signal from 
thread B, where thread B  is waiting for thread A too, or maybe thread B
 has sent the signal just before thread A attempts to wait for it (this 
is 
the actual dead lock), here there is nothing left behind to signal the waiting thread. 
You need to just program your application in such a way that you ensure there is no dead state. 
Note that there is no property or method to determine if a thread is in dead state or not.
 
It indicates the priority of the thread, a higher priority causes 
more process attention (context switch) to the thread, that could be one
 of the following:
MAX_PRIORITY 
MIN_PRIORITY 
NORM_PRIORITY (default value) 
 Daemon mode:
this one is used for setting that a 
thread should run 
in Daemon (background) mode or not. When a thread is in daemon mode, it 
means it runs until 
any other user thread (non-daemon) is alive in the application. Whenever
 there is no user-thread alive, then JVM kills the daemon threads by 
force (silently). 
You cannot 
even get any exception about the exit signal. These kinds of threads are
 useful when your application needs to have a background-service thread 
or an event-handler. 
These threads are usually run in 
lower priority. Once again, these threads are running within your process, but JVM 
does not look at them as user threads 
for checking the life of the process 
Thread's Behaviors
- Start (simultaneously): when the thread needs to run simultaneously with another thread(s), this operation is done by 
the thread 
start() method. 
- Sleep: whenever a thread needs to sleep for a particular of time 
Thread.sleep(time in ms) would help, note that there is no warranty about 
the exact time, it could get more, the sleep process (reminded time) could get skipped if another thread Interrupts the sleeping thread. 
- Interrupt: it's used when a thread needs to interrupt another thread where it is in either wait (and 
join()), sleep, or even runnable states. 
For example, thread A is waiting for a signal, then thread B interrupts thread A, here the interrupt message: 
- wakes up the target thread if it's either in wait (wait/join) or sleep state
 
- throws 
InterruptedException to the target thread to notify it about the interrupt signal 
- sets the interrupted flag to true if and only if the thread was in running state.
 
      Note 
that when a thread is in sleep, join, and wait states:
- every sleep, join, or wait operation should be surrounded with a try-catch block because of any interruption signal (exception)
 
- the interruption is just like a signal, it doesn't force the thread to shutdown
 
-  Getting the current thread: you would access the current thread by 
Thread.currentThread(). It returns a reference to the currently executing thread object, 
but outside the thread you may need to check all the threads or have a references of the thread. 
- Join: it means as it says, when thread A joins thread B, it means thread A has to wait until thread B 
is finished (termination).
 
- Yield: a thread calls 
yield it means the 
OS can switch to another thread but the first thread still needs to work.  
 
wait()
It releases the synchronized (locked) object, and waits until another
 thread notifies (notify, stop, or interrupt) it, then after it gets 
notified (if by notify) tries to acquire 
the lock again and continues its work. Note that a waiting thread has to
 acquire its lock again on the related object.
sleep()
ID doesn't release any locked object, and sleeps for a specified 
amount of time, it could get canceled (wake up) by either stop or 
interrupt signals.