Module5 Notes Multithread
Module5 Notes Multithread
Module5
Multithreaded Programming
Enumerations, Type Wrappers and Autoboxing
Multithreaded Programming: The Java Thread Model, The Main Thread, Creating a Thread,
Creating Multiple Threads, Using isAlive() and join(), Thread Priorities, Synchronization,
Interthread Communication, Suspending, Resuming, and Stopping Threads, Obtaining a
Thread’s State.
Chapter 11, 12
A process is, in essence, a program that is executing. Thus, process-based multitasking is the
feature that allows your computer to run two or more programs concurrently. In process based
a program is the smallest unit of code that the scheduler can dispatch.
For example, process-based multitasking enables you to run the Java compiler at the same
time that you are using a text editor or visiting a website.
In a thread-based multitasking environment, the thread is the smallest unit of dispatchable
code. This means that a single program can perform two or more tasks simultaneously.
For instance, a text editor can format text at the same time that it is printing, as long as these
two actions are being performed by two separate threads
• This contrasts with process-based multitasking, where each program is a separate unit,
whereas threads share the same address space and belong to the same process.
Dept of CS&E,KVGCE,Sullia 1
OOPS with JAVA (BCS306A) Module5
Thread States
• Threads exist in several states. Here is a general description. A thread can be running.
• It can be ready to run as soon as it gets CPU time. A running thread can be suspended,
which temporarily halts its activity. A suspended thread can then be resumed, allowing it
to pick up where it left off.
• A thread can be blocked when waiting for a resource. At any time, a thread can be
terminated, which halts its execution immediately. Once terminated, a thread cannot be
Dept of CS&E,KVGCE,Sullia 2
OOPS with JAVA (BCS306A) Module5
resumed.
Thread Priorities
• Java assigns to each thread a priority that determines how that thread should be treated
• with respect to the others.
• Higher-priority threads are given preference during context switches, but priority doesn't
affect the speed of execution.
• The rules that determine when a context switch takes place are simple:
➢ This occurs when explicitly yielding, sleeping, or when blocked. In this scenario,
all other threads are examined, and the highest-priority thread that is ready to
run is given the CPU.
➢ A thread can be preempted by a higher-priority thread. In this case, a lower-
priority thread that does not yield the processor is simply preempted—no matter
what it is doing—by a higher-priority thread. Basically, as soon as a higher-
priority thread wants to run, it does. This is called preemptive multitasking.
Synchronization
Java provides mechanisms like monitors to enforce synchronicity between threads, ensuring
that shared resources are accessed safely. Synchronization is achieved through the use of
synchronized methods and blocks.
Messaging
Java facilitates communication between threads through predefined methods that all objects
have. This messaging system allows threads to wait until they are explicitly notified by another
thread.
➢ Often, it must be the last thread to finish execution because it performs various
shutdown actions.
• the main thread is created automatically when your program is started, it can be controlled
through a Thread object.
• obtain a reference to it by calling the method currentThread( ), which is a public static
member of Thread.
static Thread currentThread( )
• This method returns a reference to the thread in which it is called
• The sleep( ) method causes the thread from which it is called to suspend execution for the
specified period of milliseconds.
Creating a Thread
class CurrentThreadDemo {
public static void main(String args[]) {
Thread t = Thread.currentThread(); Current thread: Thread[main,5,main]
System.out.println("Current thread: " + t); After name change: Thread[My Thread,5,main]
t.setName("My Thread"); 5
4
System.out.println("After name change: " + t);
3
try { 2
for(int n = 5; n > 0; n--) { 1
System.out.println(n);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
System.out.println("Main thread interrupted");
}
}
}
A thread by instantiating an object of typeThread. Java defines two ways in which this can be
accomplished:
1. You can implement the Runnable interface.
2. You can extend the Thread class, itself.
1. Implementing Runnable
• To create a thread, you implement the Runnable interface in a class. This interface
abstracts a unit of executable code and requires implementing a single method called
run().
• Runnable's run() Method: Inside the run() method, define the code that constitutes the
new thread. This method can call other methods, use other classes, and declare
variables just like the main thread can.run( ) establishes the entry point for another,
concurrent thread of execution within your program.
Dept of CS&E,KVGCE,Sullia 4
OOPS with JAVA (BCS306A) Module5
2. Extending Thread
• To create a thread, you create a new class that extends the Thread class. The
extending class must override the run() method, which serves as the entry point for the
new thread.
• Constructor Invocation: Inside the constructor of the extending class, you can invoke
the constructor of the Thread class using super() to specify the name of the thread.
• Starting the Thread: After creating an instance of the extending class, you call the
start() method to begin execution of the new thread.
Dept of CS&E,KVGCE,Sullia 5
OOPS with JAVA (BCS306A) Module5
Dept of CS&E,KVGCE,Sullia 6
OOPS with JAVA (BCS306A) Module5
Dept of CS&E,KVGCE,Sullia 7
OOPS with JAVA (BCS306A) Module5
• isAlive() Method:
▪ Defined by the Thread class.
▪ Returns true if the thread upon which it is called is still running.
▪ Returns false otherwise.
▪ Occasionally useful for checking the status of a thread
• join() Method:
▪ Also defined by the Thread class.
▪ Waits until the thread on which it is called terminates.
▪ The calling thread waits until the specified thread joins it
▪ Additional forms of terminate join()allow specifying a maximum amount of time to wait
for the specified thread to terminate
▪ Usage:
▪ join() is commonly used to ensure that one thread waits for another thread to
finish its execution.
▪ This is particularly useful when you want the main thread to finish last or when
you need to synchronize the execution of multiple threads.
Thread Priorities
• Thread priorities are used by the thread scheduler to decide when each thread should be
allowed to run.
• In theory, higher-priority threads get more CPU time than lower-priority threads over a given
period of time.
Dept of CS&E,KVGCE,Sullia 8
OOPS with JAVA (BCS306A) Module5
• Higher-priority threads can preempt lower-priority ones, meaning they can interrupt the
execution of lower- priority threads
• The factors other than a thread’s priority also affect how much CPU time a thread receives.
• When a child thread is started, its priority setting is equal to that of its parent thread.
• In theory, threads of equal priority should get equal access to the CPU.
• However, Java is designed to work in various environments, and the actual
behavior may differ depending on the operating system and multitasking
implementation.
• To ensure fairness, threads that share the same priority should yield control
occasionally, especially in nonpreemptive environments.
• Use the getPriority() method to obtain the current priority setting of a thread.
• Syntax:
int getPriority()
Dept of CS&E,KVGCE,Sullia 9
OOPS with JAVA (BCS306A) Module5
Synchronization
• When two or more threads need access to a shared resource, they need some way to
ensure that the resource will be used by only one thread at a time. The process by which
this is achieved is called synchronization.
• Key to synchronization is the concept of the monitor. A monitor is an object that is used
as a mutually exclusive lock.
• Only one thread can own a monitor at a given time. When a thread acquires a lock, it is
said to have entered the monitor. All other threads attempting to enter the locked monitor
will be suspended until the first thread exits the monitor. These other threads are said to
be waiting for the monitor. A thread that owns a monitor can re-enter the same monitor if
it so desires.
• You can synchronize your code in either of two ways. Both involve the use of the
synchronized keyword, and both are examined here
Implicit Monitors:
Synchronized Keyword
Synchronized Synchronized
method statements
Dept of CS&E,KVGCE,Sullia 10
OOPS with JAVA (BCS306A) Module5
• To exit the monitor and relinquish control of the object to the next
waiting thread, the owner of the monitor simply returns from the
synchronized method.
Dept of CS&E,KVGCE,Sullia 11
OOPS with JAVA (BCS306A) Module5
synchronized ( object )
{
// statements to be synchronized
}
Dept of CS&E,KVGCE,Sullia 12
OOPS with JAVA (BCS306A) Module5
Interthread Communication
consider the classic queuing problem, where one thread is producing some data and another
is consuming it. To make the problem more interesting, suppose that the producer has to wait
until the consumer is finished before it generates more data. In a polling system, the consumer
would waste many CPU cycles while it waited for the producer to produce. Once the producer
was finished, it would start polling, wasting more CPU cycles waiting for the consumer to
finish, and so on. Clearly, this situation is undesirable.
Solution is: it relies upon some form of interthread communication in which one thread can
notify another that it is blocked, and be notified that it can resume execution.
Method Definitions:
Dept of CS&E,KVGCE,Sullia 13
OOPS with JAVA (BCS306A) Module5
• wait(): Tells the calling thread to give up the monitor and go to sleep until some other
thread enters the same monitor and calls notify() or notifyAll().
• notify(): Wakes up a single thread that previously called wait() on the same object.
• notifyAll(): Wakes up all threads that previously called wait() on the same object. One of
the threads will be granted access.
All three methods are declared within the Object class and can only be called from within a
synchronized context.
Dept of CS&E,KVGCE,Sullia 14
OOPS with JAVA (BCS306A) Module5
class PCFixed {
public static void main(String[] args) {
Q q = new Q();
Producer p = new Producer(q);
Consumer c = new Consumer(q);
// Start the threads.
p.t.start();
c.t.start();
System.out.println("Press Control-C to stop.");
}
}
• Inside get( ), wait( ) is called. This causes its execution to suspend until Producer
notifies you that some data is ready.
• When this happens, execution inside get( ) resumes. After the data has been obtained,
get( ) calls notify( ).
• This tells Producer that it is okay to put more data in the queue.
• Inside put( ), wait( ) suspends execution until Consumer has removed the item from
the queue.
• When execution resumes, the next item of data is put in the queue, and notify( ) is
called. This tells Consumer that it should now remove it.
• In early versions of Java (prior to Java 2), thread suspension, resumption, and
termination were managed using suspend(), resume(), and stop() methods defined by
the Thread class.
• However, these methods were deprecated due to potential issues and risks they posed,
such as causing system failures and leaving critical data structures in corrupted states
• suspend(): Can cause serious system failures, as it doesn't release locks on critical
data structures, potentially leading to deadlock.
Dept of CS&E,KVGCE,Sullia 15
OOPS with JAVA (BCS306A) Module5
Alternative Approach:
• The wait() and notify() methods inherited from Object can be used to control the
execution of a thread.
• An example provided demonstrates how to use these methods to control thread
execution.
• It involves a boolean flag (suspendFlag) to control the execution of the thread.
• The run() method periodically checks suspendFlag, and if it's true, the thread waits.
Methods mysuspend() and myresume() are used to set and unset the flag and notify
the thread to wake up.
Dept of CS&E,KVGCE,Sullia 16
OOPS with JAVA (BCS306A) Module5
• Given a Thread instance, you can use getState( ) to obtain the state of a thread.
• For example, the following sequence determines if a thread called thrd is in the
RUNNABLE state at the time getState( ) is called:
Thread.State ts = thrd.getState();
• It is important to understand that a thread’s state may change after the call to getState(
).
• Thus, depending on the circumstances, the state obtained by calling getState( ) may
not reflect the actual state of the thread only a moment later.
• For this (and other) reasons, getState( ) is not intended to provide a means of
synchronizing threads. It’s primarily used for debugging or for profiling a thread’s run-
time characteristics.
Dept of CS&E,KVGCE,Sullia 17