L3-Threads S2 2024
L3-Threads S2 2024
Distributed Applications:
Multithreaded Programming
using Java Threads
1
Outline
◼ Introduction to Middleware
◼ Thread Applications
◼ Defining Threads
◼ Java Threads and States
◼ Architecture of Multithreaded servers
◼ Threads Synchronization
◼ Summary
2
Introduction
3
Middleware and Network Operating
System (NOS)
◼ Many DOS (Distributed OS) have been investigated, but
there are none in general/wide use. But NOS are in
wide use for various reasons both technical and non-
technical.
◼ Users have much invested in their application software; they
will not adopt a new OS that will not run their applications.
◼ Users tend to prefer to have a degree of autonomy of their
machines, even in a closely knit organisation.
◼ A combination of middleware and NOSs provides an
acceptable balance between the requirement of
autonomy and network transparency.
◼ NOS allows users to run their favorite word processor.
◼ Middleware enables users to take advantage of services that
become available in their distributed systems.
4
Introducing a middleware
◼ Building Distributed Systems
◼ DOS or NOS are not enough to build a DS!
◼ NOS are a good starting point but ….
◼ … we need an additional layer “gluing” all together
Middleware
NOS
Building Distributed Systems
◼ Middleware
◼ High-level features for DS
◼ Communication
◼ Management
◼ Application specific
◼ Uniform layer where to build DS services
◼ Runtime environment of applications
◼ Operating System
◼ Low / medium level (core) features
◼ Process / threads management
◼ Local hardware (CPU, disk, memory)
◼ Security (users, groups, domain, ACLs)
◼ Basic networking
Operating system layers and
Middleware
Ap plicatio ns, se rvic es
Midd le wa re
Node 1 Node 2
◼ Unix and Windows are two examples of Network Operating Systems – have a
networking capability built into them and so can be used to access remote
resources using basic services such as rlogin, telnet.
7
Core OS components and
functionality
Proces s manager
Superv isor
8
Threaded Applications
◼ Modern Systems
◼ Multiple applications run concurrently!
◼ This means that… there are multiple processes on
your computer
games
multimedia
pictures
Multitasking
A single threaded program
class ABC
{
….
public void main(..) begin
{
… body
..
end
}
}
11
Threaded Applications
◼ Modern Systems
◼ Applications perform many tasks at once!
◼ This means that… there are multiple threads within
a single process.
Background printing
GUI rendering
Main Thread
start
start start
14
Multithreaded Server: For Serving
Multiple Clients Concurrently
◼ Modern Applications
◼ Example: Multithreaded Web ServerProcess Request Client 1
Web/FTP
server
Client 1
Client 2
Client N
Threaded Applications
◼ Modern Applications
◼ Example: Internet Browser + Youtube
Video Streaming
Favorities, Share,
Comments Posting
Modern Applications need Threads (ex1):
Editing and Printing documents in background.
Printing Thread
Editing Thread
17
Multithreaded/Parallel File Copy
reader()
{ writer()
- - - - - - - - - buff[0] {
- - - - - - - - - - -
lock(buff[i]); lock(buff[i]);
read(src,buff[i]); buff[1]
write(src,buff[i]);
unlock(buff[i]); unlock(buff[i]);
- - - - - - - - - - - - - - - - - - -
- }
}
<request N>
Worker
Thread
Worker
Thread
Defining Threads
◼ A Thread is a piece of code that runs in
concurrent with other threads.
◼ Each thread is a statically ordered sequence
of instructions.
◼ Threads are used to express concurrency on
both single and multiprocessors machines.
◼ Programming a task having multiple threads
of control is called: Multithreading or
Multithreaded Programming.
Java Threads
MyThread MyClass
[a] [b]
23
1st method: Extending Thread
class
◼ Create a class by extending Thread class and override
run() method:
class MyThread extends Thread
{
public void run()
{
// thread body of execution
}
}
◼ Create a thread:
MyThread thr1 = new MyThread();
◼ Start Execution of threads:
thr1.start();
◼ Create and Execute:
new MyThread().start();
24
An example
class MyThread extends Thread {
public void run() {
System.out.println(" this thread is running ... ");
}
}
class ThreadEx1 {
public static void main(String [] args ) {
MyThread t = new MyThread();
t.start();
}
}
25
2nd method: Threads by
implementing Runnable interface
◼ Create a class that implements the interface Runnable and
override run() method:
class MyThread implements Runnable
{
.....
public void run()
{
// thread body of execution
}
}
◼ Creating Object:
MyThread myObject = new MyThread();
◼ Creating Thread Object:
Thread thr1 = new Thread( myObject );
◼ Start Execution:
thr1.start();
26
An example
class MyThread implements Runnable {
public void run() {
System.out.println(" this thread is running ... ");
}
}
class ThreadEx2 {
public static void main(String [] args ) {
Thread t = new Thread(new MyThread());
t.start();
}
}
27
Life Cycle of Thread
new
start()
I/O completed
ready
Time expired/ resume()
notify() interrupted
sleeping blocked
waiting
dispatch
sleep()
wait() suspend()
running Block on I/O
completion
stop() dead
28
A Program with Three Java Threads
29
Three threads example
◼ class A extends Thread
◼ {
◼ public void run()
◼ {
◼ for(int i=1;i<=5;i++)
◼ {
◼ System.out.println("\t From ThreadA: i= "+i);
◼ }
◼ System.out.println("Exit from A");
◼ }
◼ }
30
Three threads example
◼ class C extends Thread
◼ {
◼ public void run()
◼ {
◼ for(int k=1;k<=5;k++)
◼ {
◼ System.out.println("\t From ThreadC: k= "+k);
◼ }
◼ class ThreadTest
◼ {
◼ public static void main(String args[])
◼ {
◼ new A().start();
◼ new B().start();
◼ new C().start();
◼ }
◼ }
31
Run 1
◼ [raj@mundroo] threads [1:76] java ThreadTest
From ThreadA: i= 1
From ThreadA: i= 2
From ThreadA: i= 3
From ThreadA: i= 4
From ThreadA: i= 5
Exit from A
From ThreadC: k= 1
From ThreadC: k= 2
From ThreadC: k= 3
From ThreadC: k= 4
From ThreadC: k= 5
Exit from C
From ThreadB: j= 1
From ThreadB: j= 2
From ThreadB: j= 3
From ThreadB: j= 4
From ThreadB: j= 5
Exit from B
32
Run 2
◼ [raj@mundroo] threads [1:77] java ThreadTest
From ThreadA: i= 1
From ThreadA: i= 2
From ThreadA: i= 3
From ThreadA: i= 4
From ThreadA: i= 5
From ThreadC: k= 1
From ThreadC: k= 2
From ThreadC: k= 3
From ThreadC: k= 4
From ThreadC: k= 5
Exit from C
From ThreadB: j= 1
From ThreadB: j= 2
From ThreadB: j= 3
From ThreadB: j= 4
From ThreadB: j= 5
Exit from B
Exit from A
33
Thread Priority
34
Thread Priority Example
class A extends Thread
{
public void run()
{
System.out.println("Thread A started");
for(int i=1;i<=4;i++)
{
System.out.println("\t From ThreadA: i= "+i);
}
System.out.println("Exit from A");
}
}
class B extends Thread
{
public void run()
{
System.out.println("Thread B started");
for(int j=1;j<=4;j++)
{
System.out.println("\t From ThreadB: j= "+j);
}
System.out.println("Exit from B");
}
}
35
Thread Priority Example
class C extends Thread
{
public void run()
{
System.out.println("Thread C started");
for(int k=1;k<=4;k++)
{
System.out.println("\t From ThreadC: k= "+k);
}
System.out.println("Exit from C");
}
}
class ThreadPriority
{
public static void main(String args[])
{
A threadA=new A();
B threadB=new B();
C threadC=new C();
threadC.setPriority(Thread.MAX_PRIORITY);
threadB.setPriority(threadA.getPriority()+1);
threadA.setPriority(Thread.MIN_PRIORITY);
System.out.println("Started Thread A");
threadA.start();
System.out.println("Started Thread B");
threadB.start();
System.out.println("Started Thread C");
threadC.start();
System.out.println("End of main thread");
}
}
36
Assignment 1 at a Glance: Multithreaded
Dictionary Server – Using Sockets and Threads
A Client Program
Meaning(“love”)?
A Client
Program in “C” A Client
Meaning(“java”)? Program in “C++”
Meaning(“channel”)?
37
Use of Sockets in Assignment 1:
A Suggestion
◼ First time:
◼ Use TCP Sockets
◼ Prior background in TCP Sockets:
◼ Use UDP Sockets
◼ Full details –released as part of:
◼ “Assignment 1 Guideline” Document
38
Accessing Shared Resources
39
Online Bank: Serving Many
Customers and Operations
Internet
Bank Server
Client 1 Bank Operator 1
Client 2
Bank Operator M
41
the driver: 3 Threads sharing the
same object
class InternetBankingSystem {
public static void main(String [] args ) {
Account accountObject = new Account ();
Thread t1 = new Thread(new MyThread(accountObject));
Thread t2 = new Thread(new YourThread(accountObject));
Thread t3 = new Thread(new HerThread(accountObject));
t1.start();
t2.start();
t3.start();
// DO some other operation
} // end main()
}
42
Shared account object
between 3 threads
class MyThread implements Runnable {
Account account;
public MyThread (Account s) { account = s;}
public void run() { account.deposit(); }
} // end class MyThread
44
Architecture for Multithread Servers
45
Client and server with threads
(worker-pool architecture)
Thread 2 makes
requests to server
Receipt & Input-output
queuing
Thread 1
generates
results
T1
Requests
N threads
Client
Server
46
Alternative server threading
architectures
Contr ol tr ansfer v ia
pr iv ileg ed in struc tions
User Ker nel
Pr otection domain
(b ) RPC/RMI ( within one c omputer ) bou ndar y
Use r 1 Use r 2
Ker nel 1 Ker nel 2
49
Summary
◼ Operating system provides various types of facilities to support
middleware for distributed system:
◼ encapsulation, protection, and concurrent access and management of
node resources.
◼ Multithreading enables servers to maximize their throughput,
measured as the number of requests processed per second.
◼ Threads support treating of requests with varying priorities.
◼ Various types of architectures can be used in concurrent
processing:
◼ Worker pool
◼ Thread-per-request
◼ Thread-per-connection
◼ Thread-per-object
◼ Threads need to be synchronized when accessing and
manipulating shared resources.
◼ New OS designs provide flexibility in terms of separating
mechanisms from policies.
52
References
53