8th Home Work, Practical and Theoretical Questions
This commit is contained in:
@@ -0,0 +1,354 @@
|
||||
\documentclass[12pt,a4paper]{article}
|
||||
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage[T1]{fontenc}
|
||||
\usepackage[margin=2.5cm]{geometry}
|
||||
\usepackage{listings}
|
||||
\usepackage{xcolor}
|
||||
\usepackage{hyperref}
|
||||
\usepackage{parskip}
|
||||
\usepackage{booktabs}
|
||||
\usepackage{array}
|
||||
\usepackage{titlesec}
|
||||
\usepackage{fancyhdr}
|
||||
\usepackage{amsmath}
|
||||
\usepackage{enumitem}
|
||||
|
||||
% ── Page style ──────────────────────────────────────────────────────────────
|
||||
\pagestyle{fancy}
|
||||
\fancyhf{}
|
||||
\rhead{Advanced Programming – Assignment 8}
|
||||
\lhead{Faraz Ardeh}
|
||||
\cfoot{\thepage}
|
||||
|
||||
% ── Section formatting ───────────────────────────────────────────────────────
|
||||
\titleformat{\section}{\large\bfseries}{Question \thesection.}{0.6em}{}
|
||||
\titleformat{\subsection}{\normalsize\bfseries}{}{0em}{}
|
||||
|
||||
% ── Java code style ─────────────────────────────────────────────────────────
|
||||
\definecolor{javakw}{rgb}{0.13,0.13,0.60}
|
||||
\definecolor{javastr}{rgb}{0.63,0.13,0.13}
|
||||
\definecolor{javacmt}{rgb}{0.38,0.38,0.38}
|
||||
\definecolor{codebg}{rgb}{0.97,0.97,0.97}
|
||||
\definecolor{codefr}{rgb}{0.82,0.82,0.82}
|
||||
|
||||
\lstdefinestyle{java}{
|
||||
language=Java,
|
||||
basicstyle=\ttfamily\small,
|
||||
keywordstyle=\color{javakw}\bfseries,
|
||||
stringstyle=\color{javastr},
|
||||
commentstyle=\color{javacmt}\itshape,
|
||||
numberstyle=\tiny\color{gray},
|
||||
numbers=left,
|
||||
stepnumber=1,
|
||||
numbersep=8pt,
|
||||
backgroundcolor=\color{codebg},
|
||||
frame=single,
|
||||
rulecolor=\color{codefr},
|
||||
breaklines=true,
|
||||
breakatwhitespace=false,
|
||||
showstringspaces=false,
|
||||
tabsize=4,
|
||||
captionpos=b,
|
||||
}
|
||||
|
||||
\lstset{style=java}
|
||||
|
||||
% ── Inline code ─────────────────────────────────────────────────────────────
|
||||
\newcommand{\code}[1]{\texttt{\small #1}}
|
||||
|
||||
% ────────────────────────────────────────────────────────────────────────────
|
||||
\begin{document}
|
||||
|
||||
% ── Title page ───────────────────────────────────────────────────────────────
|
||||
\begin{titlepage}
|
||||
\centering
|
||||
\vspace*{3cm}
|
||||
{\Huge\bfseries Multithreading Basics\par}
|
||||
\vspace{0.8cm}
|
||||
{\large Assignment 8 – Theoretical Questions\par}
|
||||
\vspace{0.4cm}
|
||||
{\large Advanced Programming (AP)\par}
|
||||
\vspace{2cm}
|
||||
\rule{0.6\linewidth}{0.5pt}\\[0.4cm]
|
||||
{\large\bfseries Faraz Ardeh\par}
|
||||
\vspace{0.3cm}
|
||||
{\normalsize fa.ardeh@gmail.com\par}
|
||||
\vspace{0.6cm}
|
||||
{\normalsize Shahid Beheshti University\par}
|
||||
\vspace{0.3cm}
|
||||
{\normalsize June 2026\par}
|
||||
\vfill
|
||||
\end{titlepage}
|
||||
|
||||
\tableofcontents
|
||||
\newpage
|
||||
|
||||
% ════════════════════════════════════════════════════════════════════════════
|
||||
\section{\code{start()} vs \code{run()}}
|
||||
% ════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
The program under analysis:
|
||||
|
||||
\begin{lstlisting}[caption={StartVsRun.java}]
|
||||
public class StartVsRun {
|
||||
static class MyRunnable implements Runnable {
|
||||
public void run() {
|
||||
System.out.println("Running in: " + Thread.currentThread().getName());
|
||||
}
|
||||
}
|
||||
public static void main(String[] args) throws InterruptedException {
|
||||
Thread t1 = new Thread(new MyRunnable(), "Thread-1");
|
||||
System.out.println("Calling run()");
|
||||
t1.run();
|
||||
Thread.sleep(100);
|
||||
|
||||
Thread t2 = new Thread(new MyRunnable(), "Thread-2");
|
||||
System.out.println("Calling start()");
|
||||
t2.start();
|
||||
}
|
||||
}
|
||||
\end{lstlisting}
|
||||
|
||||
\subsection{Expected output}
|
||||
|
||||
\begin{lstlisting}[language={},numbers=none,backgroundcolor=\color{codebg}]
|
||||
Calling run()
|
||||
Running in: main
|
||||
Calling start()
|
||||
Running in: Thread-2
|
||||
\end{lstlisting}
|
||||
|
||||
\subsection{Why this output?}
|
||||
|
||||
\textbf{The \code{t1.run()} call:}
|
||||
Calling \code{run()} on a \code{Thread} object is just an ordinary method call, exactly
|
||||
like calling any other method on any other object.
|
||||
No new OS thread is created or scheduled.
|
||||
The body of \code{run()} executes \emph{synchronously} inside the calling thread,
|
||||
which is \code{main}.
|
||||
Therefore \code{Thread.currentThread().getName()} returns \texttt{"main"},
|
||||
not \texttt{"Thread-1"}.
|
||||
The thread object \texttt{t1} was constructed but its native thread was never started.
|
||||
|
||||
\textbf{The \code{t2.start()} call:}
|
||||
\code{start()} allocates a new OS-level thread, registers it with the JVM scheduler,
|
||||
and returns to the caller \emph{immediately} (it does not wait for \code{run()} to finish).
|
||||
The new thread then invokes \code{run()} autonomously and concurrently.
|
||||
Inside that new thread, \code{Thread.currentThread().getName()} correctly
|
||||
returns \texttt{"Thread-2"}.
|
||||
|
||||
\subsection{Key differences at a glance}
|
||||
|
||||
\begin{center}
|
||||
\begin{tabular}{>{\bfseries}lll}
|
||||
\toprule
|
||||
Aspect & \code{run()} & \code{start()} \\
|
||||
\midrule
|
||||
New thread created? & No & Yes (exactly one) \\
|
||||
Execution thread & Current thread & New thread \\
|
||||
Blocking behaviour & Synchronous (caller waits) & Asynchronous (returns at once) \\
|
||||
Can be called twice? & Yes, legal & No – throws \code{IllegalThreadStateException} \\
|
||||
Useful for? & Testing \code{run()} logic directly & True concurrent execution \\
|
||||
\bottomrule
|
||||
\end{tabular}
|
||||
\end{center}
|
||||
|
||||
\textbf{Summary:}
|
||||
\code{run()} is simply a method call; \code{start()} is what actually creates and
|
||||
launches a new thread of execution. Calling \code{run()} instead of \code{start()} is
|
||||
one of the most common multithreading bugs in Java – the code compiles and
|
||||
"works", but no concurrency ever happens.
|
||||
|
||||
% ════════════════════════════════════════════════════════════════════════════
|
||||
\section{Daemon Threads}
|
||||
% ════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
\begin{lstlisting}[caption={DaemonExample.java}]
|
||||
public class DaemonExample {
|
||||
static class DaemonRunnable implements Runnable {
|
||||
public void run() {
|
||||
for (int i = 0; i < 20; i++) {
|
||||
System.out.println("Daemon thread running...");
|
||||
try {
|
||||
Thread.sleep(500);
|
||||
} catch (InterruptedException e) {
|
||||
// [Handling Exception...]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
public static void main(String[] args) {
|
||||
Thread thread = new Thread(new DaemonRunnable());
|
||||
thread.setDaemon(true);
|
||||
thread.start();
|
||||
System.out.println("Main thread ends.");
|
||||
}
|
||||
}
|
||||
\end{lstlisting}
|
||||
|
||||
\subsection{Expected output (with \code{setDaemon(true)})}
|
||||
|
||||
\begin{lstlisting}[language={},numbers=none,backgroundcolor=\color{codebg}]
|
||||
Main thread ends.
|
||||
Daemon thread running...
|
||||
(program terminates -- usually 0-2 more lines, non-deterministic)
|
||||
\end{lstlisting}
|
||||
|
||||
\textbf{Why?}
|
||||
The JVM shuts down when there are no \emph{non-daemon} threads still alive.
|
||||
After \code{main()} prints \texttt{"Main thread ends."} and returns, the only surviving
|
||||
thread is the daemon thread.
|
||||
Because it is marked as a daemon, the JVM does \emph{not} wait for it to
|
||||
finish – it exits immediately (or after one scheduling quantum), abruptly
|
||||
terminating the daemon thread.
|
||||
The daemon may manage to print zero, one, or a few lines before termination,
|
||||
depending entirely on OS thread scheduling; this is non-deterministic.
|
||||
|
||||
\subsection{What happens if you remove \code{thread.setDaemon(true)}?}
|
||||
|
||||
Without that call the thread becomes a regular \emph{user thread} (the default).
|
||||
The JVM rule is: \textbf{wait for all user threads to finish before exiting.}
|
||||
The daemon thread (now a user thread) will sleep 500 ms per iteration and
|
||||
loop 20 times – the program will take approximately $20 \times 0.5 = 10$ seconds
|
||||
to terminate, and all 20 lines of \texttt{"Daemon thread running..."} will be
|
||||
printed in full before the JVM exits.
|
||||
|
||||
\subsection{Real-life use cases of daemon threads}
|
||||
|
||||
Daemon threads are ideal for background housekeeping work that should not
|
||||
prevent the application from exiting cleanly.
|
||||
|
||||
\begin{enumerate}[leftmargin=2em]
|
||||
\item \textbf{Garbage Collection.}
|
||||
The JVM's garbage collector runs as a daemon thread;
|
||||
it must not keep the JVM alive on its own.
|
||||
|
||||
\item \textbf{Log flushing.}
|
||||
A background thread that periodically flushes buffered log entries
|
||||
to disk. If the application finishes, unsaved logs are
|
||||
an acceptable loss compared with hanging the process.
|
||||
|
||||
\item \textbf{Cache invalidation / expiry.}
|
||||
A thread that sweeps an in-memory cache and removes stale entries
|
||||
does not need to outlive the application.
|
||||
|
||||
\item \textbf{Heartbeat / health-check threads.}
|
||||
Service-mesh sidecars and microservices often send periodic
|
||||
pings to a service-discovery system.
|
||||
These should die with the service, not keep it alive.
|
||||
|
||||
\item \textbf{IDE background indexing.}
|
||||
IntelliJ IDEA's indexer and VS Code's language-server workers
|
||||
are typically daemon-like: if you close the IDE, you do not
|
||||
want to wait for them to finish indexing.
|
||||
\end{enumerate}
|
||||
|
||||
% ════════════════════════════════════════════════════════════════════════════
|
||||
\section{A Shorter Way to Create Threads – Lambda Expressions}
|
||||
% ════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
\begin{lstlisting}[caption={ThreadDemo.java}]
|
||||
public class ThreadDemo {
|
||||
public static void main(String[] args) {
|
||||
Thread thread = new Thread(() -> {
|
||||
System.out.println("Thread is running using a lambda!");
|
||||
});
|
||||
|
||||
thread.start();
|
||||
}
|
||||
}
|
||||
\end{lstlisting}
|
||||
|
||||
\subsection{Expected output}
|
||||
|
||||
\begin{lstlisting}[language={},numbers=none,backgroundcolor=\color{codebg}]
|
||||
Thread is running using a lambda!
|
||||
\end{lstlisting}
|
||||
|
||||
\subsection{What is \code{() -> \{ \ldots \}} called?}
|
||||
|
||||
The \code{() -> \{ \ldots \}} syntax is called a \textbf{lambda expression}
|
||||
(also known as an \emph{anonymous function} or \emph{arrow function} in
|
||||
other languages).
|
||||
|
||||
A lambda expression is a concise way to provide an implementation of a
|
||||
\emph{functional interface} – any interface that declares exactly one abstract
|
||||
method.
|
||||
\code{Runnable} is a functional interface: its single abstract method is
|
||||
\code{void run()}.
|
||||
The lambda \code{() -> \{ \ldots \}} supplies that implementation inline,
|
||||
without naming it.
|
||||
|
||||
\subsection{How does this differ from other approaches?}
|
||||
|
||||
There are three common ways to supply a \code{Runnable} to a \code{Thread}:
|
||||
|
||||
\begin{lstlisting}[caption={Three equivalent approaches}]
|
||||
// 1. Class that extends Thread
|
||||
class MyThread extends Thread {
|
||||
public void run() { System.out.println("extends Thread"); }
|
||||
}
|
||||
new MyThread().start();
|
||||
|
||||
// 2. Named class that implements Runnable
|
||||
class MyRunnable implements Runnable {
|
||||
public void run() { System.out.println("implements Runnable"); }
|
||||
}
|
||||
new Thread(new MyRunnable()).start();
|
||||
|
||||
// 3. Lambda expression (shortest)
|
||||
new Thread(() -> System.out.println("lambda")).start();
|
||||
\end{lstlisting}
|
||||
|
||||
\begin{center}
|
||||
\begin{tabular}{>{\bfseries}lllll}
|
||||
\toprule
|
||||
Approach & Boilerplate & Separate class? & Captures outer vars? & Extensible? \\
|
||||
\midrule
|
||||
\code{extends Thread} & High & Yes (named) & No & Inherits Thread \\
|
||||
\code{implements Runnable} & Medium & Yes (named) & No & Yes \\
|
||||
Anonymous class & Medium & Yes (anon.) & Yes (eff.\ final) & Yes \\
|
||||
Lambda & \textbf{Minimal} & No & Yes (eff.\ final) & No \\
|
||||
\bottomrule
|
||||
\end{tabular}
|
||||
\end{center}
|
||||
|
||||
\textbf{Key advantages of lambdas:}
|
||||
\begin{itemize}[leftmargin=2em]
|
||||
\item \textbf{Conciseness.}
|
||||
No need to declare a class, override a method, or write a constructor.
|
||||
A single line can create and start a thread.
|
||||
|
||||
\item \textbf{Readability.}
|
||||
The intent (``run this block of code in a new thread'') is immediately
|
||||
obvious to the reader.
|
||||
|
||||
\item \textbf{Variable capture.}
|
||||
A lambda can reference local variables from the enclosing scope as long
|
||||
as they are effectively final (i.e., never reassigned after declaration).
|
||||
This is often more convenient than passing data through a constructor.
|
||||
|
||||
\item \textbf{Functional programming patterns.}
|
||||
Lambdas work seamlessly with the Java Streams API, \code{CompletableFuture},
|
||||
\code{ExecutorService}, and other modern concurrency utilities that accept
|
||||
\code{Runnable} or \code{Callable} arguments.
|
||||
\end{itemize}
|
||||
|
||||
\textbf{Limitation:}
|
||||
Because a lambda is not a subclass of \code{Thread}, it cannot override thread
|
||||
life-cycle methods such as \code{interrupt()} or \code{setUncaughtExceptionHandler()}
|
||||
directly inside the lambda body.
|
||||
When that level of control is needed, a named class is more appropriate.
|
||||
|
||||
% ── Footer note ──────────────────────────────────────────────────────────────
|
||||
\vfill
|
||||
\begin{center}
|
||||
\small\color{gray}
|
||||
Advanced Programming – Assignment 8 \quad|\quad
|
||||
Faraz Ardeh \quad|\quad
|
||||
Shahid Beheshti University \quad|\quad
|
||||
June 2026
|
||||
\end{center}
|
||||
|
||||
\end{document}
|
||||
Reference in New Issue
Block a user