|
Threads
|
A java thread is an execution context or a
lightweight process. It is a single sequential
flow of control within a program. Programmer may
use java thread mechanism to execute multiple
tasks at the same time.
[More in ebook]
|
|
Thread
class and run() Method
- Basic support for threads is in the
java.lang.Thread class. It provides a thread
API and all the generic behavior for threads.
These behaviors include starting, sleeping,
running, yielding, and having a priority.
- The run() method gives a thread something
to do. Its code should implement the thread's
running behavior.
There are two ways of creating a customized
thread:
- Sub classing java.lang.Thread and
Overriding run() method.
- Implementing the java.lang.Runnable
Interface.
[More in ebook]
|
|
Thread
Scheduling
- When we say that threads are running
concurrently, in practice it may not be so. On
a computer with single CPU, threads actually
run one at a time giving an illusion of
concurrency.
- The execution of multiple threads on a
single CPU based on some algorithm is called
thread scheduling.
- Thread scheduler maintains a pool of all
the ready-to-run threads. Based on fixed
priority algorithm, it allocates free CPU to
one of these threads.
[More in ebook]
|
|
The Life
Cycle of a Thread
The following diagram illustrates the various
states that a Java thread can be in at any point
during its life and which method calls cause a
transition to another state.[More in ebook]

-
Ready-to-run
A thread starts its life cycle with a call to
start(). For example
MyThread aThread = new MyThread();
aThread.start();
A call to start() will not immediately start thread's
execution but rather will move it to pool of threads waiting for
their turn to be picked for execution. The thread scheduler picks
one of the ready-to-run threads based on thread priorities.
-
Running
The thread code is being actively executed by
the processor. It runs until it is swapped
out, becomes blocked, or voluntarily give up
its turn with this static method
Thread.yield();
Please note that yield() is a static method. Even if it is
called on any thread object, it causes the currently executing
thread to give up the CPU.
-
Waiting
A call to java.lang.Object's wait() method
causes the current thread object to wait. The
thread remains in "Waiting" state until some
another thread invokes notify() or the
notifyAll() method of this object. The
current thread must own this object's monitor
for calling the wait().
-
Sleeping
Java thread may be forced to sleep
(suspended) for some predefined time.
Thread.sleep(milliseconds);
Thread.sleep(milliseconds, nanoseconds);
Please note that static method sleep() only guarantees that
the thread will sleep for predefined time and be running some
time after the predefined time has been elapsed.
For example, a call to sleep(60) will cause
the currently executing thread to sleep for
60 milliseconds. This thread will be in
ready-to-run state after that. It will be in
"Running" state only when the scheduler will
pick it for execution. Thus we can only say
that the thread will run some time after
60 milliseconds.
[More in ebook]
-
Blocked on I/O.
A java thread may enter this state while
waiting for data from the IO device. The
thread will move to Ready-to-Run after I/O
condition changes (such as reading a byte of
data).
-
Blocked on Synchronization.
A java thread may enter this state while
waiting for object lock. The thread will move
to Ready-to-Run when a lock is
acquired.
-
Dead
A java thread may enter this state when it is
finished working. It may also enter this
state if the thread is terminated by an
unrecoverable error condition.
|
|
Thread
Synchronization
Problems may occur when two threads are trying to
access/modify the same object. To prevent such
problems, Java uses monitors and the synchronized keyword to
control access to an object by a thread.
[More in ebook]
-
Monitor
- Monitor is any class with
synchronized
code in it.
- Monitor controls its client threads
using, wait() and notify() ( or notifyAll()
) methods.
- wait() and notify() methods must be
called in synchronized code.
- Monitor asks client threads to wait if
it is unavailable.
- Normally a call to wait() is placed in
while loop. The condition of while loop
generally tests the availability of
monitor. After waiting, thread resumes
execution from the point it left.
-
Synchronized code and Locks
-
Object lock
Each Object has a lock. This lock can be
controlled by at most one thread at time.
Lock controls the access to the
synchronized code.
- When an executing thread encounters a
synchronized
statement, it goes in blocked state and
waits until it acquires the object lock.
After that, it executes the code block and
then releases the lock. While the executing
thread owns the lock, no other thread can
acquire the lock. Thus the locks and
synchronization mechanism ensures proper
exceution of code in multiple threading.
[More in ebook]
|
|
|
Thread
Priority
A thread's priority is specified with an integer
from 1 (the lowest) to 10 (the highest),
Constants Thread.MIN_PRIORITY and
Thread.MAX_PRIORITY can also be used. By default,
the setPriority() method sets the thread priority
to 5, which is the Thread.NORM_PRIORITY.
Thread aThread = Thread.currentThread();
int currentPriority;
currentPriority = aThread.getPriority();
aThread.setPriority( currentPriority + 1 );
Setting priorities may not always have the desired effect
because prioritization schemes may be implemented differently on
different platforms. However, if you cannot resist messing with
priorities, use higher priorities for threads that frequently
block (sleeping or waiting for I/O). Use medium to low-priority
for CPU-intensive threads to avoid hogging the processor
down. [More in ebook]
|
|
Thread
Deadlock
In multiple threading, following problems may
occur.
- Deadlock or deadly embrace occurs when two
or more threads are trying to gain control of
the same object, and each one has a lock on
another resource that they need in order to
proceed.
- For example, When thread A waiting for lock
on Object P while holding the lock on Object Q
and at the same time, thread B holding a lock
on Object P and waiting for lock on Object Q,
deadlock occurs.
- Please note that if the thread is holding a
lock and went to a sleeping state, it does not
loose the lock. However, when thread goes in
blocked state, it normally releases the lock.
This eliminates the potential of deadlocking
threads.
- Java does not provide any mechanisms for
detection or control of deadlock situations, so
the programmer is responsible for avoiding
them.
[More in ebook]
|
|