From bcf960805e44f97232711af4130c0e0ae59f31ef Mon Sep 17 00:00:00 2001 From: Matin Date: Fri, 12 Jun 2026 20:18:28 +0430 Subject: [PATCH 1/3] Implement download worker --- src/{main => }/java/ChunkStatus.java | 0 src/{main => }/java/ChunkUtils.java | 0 src/{main => }/java/ConfigReader.java | 0 src/{main => }/java/DownloadConfig.java | 0 src/{main => }/java/DownloadWorker.java | 23 ++++++++++++++++++++ src/{main => }/java/Main.java | 0 src/{main => }/java/ProgressMonitor.java | 1 + src/{main => }/resources/download_config.txt | 0 8 files changed, 24 insertions(+) rename src/{main => }/java/ChunkStatus.java (100%) rename src/{main => }/java/ChunkUtils.java (100%) rename src/{main => }/java/ConfigReader.java (100%) rename src/{main => }/java/DownloadConfig.java (100%) rename src/{main => }/java/DownloadWorker.java (57%) rename src/{main => }/java/Main.java (100%) rename src/{main => }/java/ProgressMonitor.java (99%) rename src/{main => }/resources/download_config.txt (100%) diff --git a/src/main/java/ChunkStatus.java b/src/java/ChunkStatus.java similarity index 100% rename from src/main/java/ChunkStatus.java rename to src/java/ChunkStatus.java diff --git a/src/main/java/ChunkUtils.java b/src/java/ChunkUtils.java similarity index 100% rename from src/main/java/ChunkUtils.java rename to src/java/ChunkUtils.java diff --git a/src/main/java/ConfigReader.java b/src/java/ConfigReader.java similarity index 100% rename from src/main/java/ConfigReader.java rename to src/java/ConfigReader.java diff --git a/src/main/java/DownloadConfig.java b/src/java/DownloadConfig.java similarity index 100% rename from src/main/java/DownloadConfig.java rename to src/java/DownloadConfig.java diff --git a/src/main/java/DownloadWorker.java b/src/java/DownloadWorker.java similarity index 57% rename from src/main/java/DownloadWorker.java rename to src/java/DownloadWorker.java index 546de2d..3c1082a 100644 --- a/src/main/java/DownloadWorker.java +++ b/src/java/DownloadWorker.java @@ -22,22 +22,45 @@ public class DownloadWorker implements Runnable { @Override public void run() { // TODO: Record the chunk start time in chunkStatus. + chunkStatus.setStartTimeMs(System.currentTimeMilliS()) ; double downloaded = 0.0; // TODO: Print a message that this chunk has started downloading. + System.out.println(Thread.currentThread().getName() + " started downloading Chunk #" + chunkStatus.getChunkId()); while (downloaded < chunkStatus.getChunkSizeMB()) { // TODO: Generate a random sleep delay between min and max delay. + int minDelay = config.getMinStepDelayMs() ; + int maxDelay = config.getMaxStepDalayMs() ; + int delay = minDelay + random.nextInt(maxDelay-minDelay +1) ; + // TODO: Sleep for that delay. + Thread.sleep(delay) ; // TODO: Generate a random download amount for this step. + double minStep = config.getMinStepDownloadMB() ; + double maxStep = config.getMaxStepDownloadMB() ; + double stepDownload = minStep + ((maxStep-minStep)*random.nextDouble()) ; + + // TODO: Increase downloaded, but do not go beyond chunk size. + downloaded += stepDownload ; + if (downloaded > chunkStatus.getChunkSizeMB()) + { + downloaded = chunkStatus.getChunkSizeMB() ; + } + // TODO: Save the updated downloaded value into chunkStatus. + chunkStatus.setDownloadedMB(downloaded) ; // TODO: Optionally print step-by-step progress. } + // TODO: Mark the chunk as completed. + chunkStatus.setCompleted(true ); // TODO: Record the chunk end time in chunkStatus. + chunkStatus.setEndTimeMs(System.currentTimeMillis()) ; // TODO: Print a message that this chunk has finished downloading. + System.out.println(Thread.currentThread().getName() + " finished downloading Chunk #" + chunkStatus.getChunkId()); } } diff --git a/src/main/java/Main.java b/src/java/Main.java similarity index 100% rename from src/main/java/Main.java rename to src/java/Main.java diff --git a/src/main/java/ProgressMonitor.java b/src/java/ProgressMonitor.java similarity index 99% rename from src/main/java/ProgressMonitor.java rename to src/java/ProgressMonitor.java index 475c0e0..3e5dc2f 100644 --- a/src/main/java/ProgressMonitor.java +++ b/src/java/ProgressMonitor.java @@ -27,6 +27,7 @@ public class ProgressMonitor implements Runnable { // 6. Otherwise sleep for monitorDelayMs and continue + while (true) { double totalDownloadedMB = 0.0; int completedChunks = 0; diff --git a/src/main/resources/download_config.txt b/src/resources/download_config.txt similarity index 100% rename from src/main/resources/download_config.txt rename to src/resources/download_config.txt From 3f0342ef888f18ef7a1a161e2086df4b8e1d28a3 Mon Sep 17 00:00:00 2001 From: Matin Date: Sat, 13 Jun 2026 19:57:41 +0430 Subject: [PATCH 2/3] Implement ProgressMonitor --- src/java/ProgressMonitor.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/java/ProgressMonitor.java b/src/java/ProgressMonitor.java index 3e5dc2f..1924bc1 100644 --- a/src/java/ProgressMonitor.java +++ b/src/java/ProgressMonitor.java @@ -58,6 +58,12 @@ public class ProgressMonitor implements Runnable { // TODO: // If all chunks are completed, print a final message and exit the loop + if (completedChunks == chunks.size()) + { + + System.out.println("Progress Monitor: All chunks successfully downloaded. Exiting monitor thread."); + break; + } try { Thread.sleep(monitorDelayMs); From 10a49e83e5753044dcb5d7b67949cc9ce64fb7e3 Mon Sep 17 00:00:00 2001 From: Matin Date: Sat, 13 Jun 2026 20:28:01 +0430 Subject: [PATCH 3/3] finish --- src/java/Main.java | 23 +++++++++++++++++++---- src/java/ProgressMonitor.java | 2 +- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/java/Main.java b/src/java/Main.java index 82bd239..77b06e7 100644 --- a/src/java/Main.java +++ b/src/java/Main.java @@ -37,6 +37,7 @@ public class Main { // TODO: // Students may print helpful debug information here, // for example which chunk is assigned to which worker thread. + System.out.println("Assignment Chunk : " + chunk.chunk.getChunkId() + "(" + chunk.getChunkSizeMB) + "MB)" + workerThread.getName()) ; } // 4. Create and start monitor thread @@ -48,12 +49,17 @@ public class Main { // so that progress can be displayed while downloading happens. // // Example idea: - // monitorThread.start(); + monitorThread.start(); + // 5. Start worker threads // TODO: // Start each worker thread in workerThreads. // Use a loop and call start() on each thread. + for(Thread thread : workerThreads) + { + thread.start() ; + } // 6. Wait for workers to finish // TODO: @@ -61,9 +67,13 @@ public class Main { // This should be done inside a try-catch block for InterruptedException. // // Hint: - // for (Thread thread : workerThreads) { - // thread.join(); - // } + try { + for (Thread thread : workerThreads) { + thread.join(); + } + } catch (java.lang.Exception e) { + System.out.println("Main thread was interrupted while waiting for workers.") + } // TODO: // After all workers finish, the monitor thread may also need to stop. @@ -76,6 +86,11 @@ public class Main { // NOTE: // this final report may show 0 progress because no worker has actually run yet. // Until students complete the thread start/join TODOs above, + try { + monitorThread.join(); + } catch (InterruptedException e) { + System.out.println("Main thread was interrupted while waiting for monitor."); + } // 7. Print final report System.out.println(); diff --git a/src/java/ProgressMonitor.java b/src/java/ProgressMonitor.java index 1924bc1..5f1d5f9 100644 --- a/src/java/ProgressMonitor.java +++ b/src/java/ProgressMonitor.java @@ -60,7 +60,7 @@ public class ProgressMonitor implements Runnable { // If all chunks are completed, print a final message and exit the loop if (completedChunks == chunks.size()) { - + System.out.println("Progress Monitor: All chunks successfully downloaded. Exiting monitor thread."); break; }