This commit is contained in:
2026-06-15 20:44:47 +03:30
parent 9e5c715088
commit 55b3f70d7c
6 changed files with 392 additions and 97 deletions
+65
View File
@@ -0,0 +1,65 @@
# Assignment Report: Multithreading Basics
### Course: Advanced Programming
## Assignment: Eighth Assignment Multithreading Basics
Project: Simulated Download Manager
1. Theoretical Questions
1.1 Difference Between start() and run()
In Java, the run() method contains the code that a thread should execute. However, calling run() directly does not create a new thread; it works like a normal method call in the current thread.
When start() is called, the JVM creates a new thread, which then executes the run() method internally.
1.2 Daemon Threads
A daemon thread is a background thread. The JVM does not wait for daemon threads to finish. When all user threads finish, the JVM stops the program even if daemon threads are still running.
If setDaemon(true) is removed, the thread becomes a normal user thread, and the JVM will wait for it to complete.
1.3 Lambda Expressions for Threads
A lambda expression is a concise way to implement a functional interface like Runnable. Since Runnable has only one method (run()), we can use:
() -> { ... } instead of creating a whole new class.
2. Practical Implementation
2.1 Project Overview
This project simulates a download manager where a file is divided into chunks, and each chunk is downloaded concurrently by separate worker threads.
2.2 DownloadWorker
The DownloadWorker class implements Runnable. It simulates the download of a single chunk by:
Using random step sizes for download progress.
Sleeping for random delays to simulate network latency.
Updating its chunk status until the download is complete.
2.3 ChunkStatus
This class stores the state of each chunk, including its ID, size, and downloaded amount. Variables are marked as volatile to ensure visibility across different threads.
2.4 ProgressMonitor
The ProgressMonitor runs as a background thread to periodically check and print:
Individual chunk progress.
Total download percentage.
A visual Progress Bar.
Average download speed and ETA.
2.5 Main Class
The Main class coordinates the process:
Reads configuration.
Initializes chunks and worker threads.
Starts the monitor and workers.
Uses join() to wait for all threads to finish before printing the final report.
3. Bonus Features
3.1 Progress Bar & ETA
A visual progress bar was added to the console output. The program also calculates the current speed in MB/s and estimates the remaining time (ETA) based on that speed.
3.2 Sequential vs Multithreaded Comparison
The program compares running the workers sequentially (using .run()) versus concurrently (using .start()). It calculates the Speedup to show how much faster multithreading is for this task.
4. Execution Instructions
To compile and run the project, use the following commands:
bash
mvn compile
mvn exec:java -Dexec.mainClass="Main"
5. Conclusion
This project successfully demonstrates the power of multithreading in Java. By using separate threads for different chunks, the total download time is significantly reduced compared to a sequential approach.