From ddea31c4fdd8f75e8c9b1e76eefaec11307d0e66 Mon Sep 17 00:00:00 2001 From: neda Date: Sun, 19 Jul 2026 06:17:24 +0330 Subject: [PATCH] multihreading --- .idea/.gitignore | 10 ++ .idea/compiler.xml | 13 ++ .idea/encodings.xml | 7 + .idea/jarRepositories.xml | 20 +++ .idea/misc.xml | 12 ++ .idea/vcs.xml | 6 + src/main/java/dev/Main.java | 161 +++++++++++++++--- src/main/java/dev/model/Student.java | 40 ++--- src/main/java/dev/service/StudentManager.java | 38 +++-- src/main/java/dev/thread/StudentLoader.java | 38 +++-- src/main/java/dev/utils/FileManager.java | 25 ++- .../basics/JoinSimpleExample.java | 2 +- .../lecture/multithreading/timeout/Main.java | 34 +++- 13 files changed, 321 insertions(+), 85 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..30cf57e --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Ignored default folder with query files +/queries/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..a590144 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..4158879 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..ad7d837 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/main/java/dev/Main.java b/src/main/java/dev/Main.java index 19ca657..f0ec76a 100644 --- a/src/main/java/dev/Main.java +++ b/src/main/java/dev/Main.java @@ -1,22 +1,34 @@ package dev; + +import dev.model.Student; import dev.service.StudentManager; import dev.thread.StudentLoader; import dev.utils.FileManager; + +import java.util.ArrayList; import java.util.List; import java.util.Scanner; + public class Main { + public static void main(String[] args) throws Exception { + Scanner scanner = new Scanner(System.in); - StudentManager manager = new StudentManager(); + + StudentManager manager = + new StudentManager(); + + while (true) { + System.out.println(""" 1.Load students 2.Search student @@ -25,71 +37,180 @@ public class Main { 5.Exit """); + + int choice = scanner.nextInt(); + + switch (choice) { + + case 1 -> { - List data = FileManager.loadStudents("students.txt"); - // TODO: + List data = + FileManager.loadStudents("students.txt"); - // Split data into 3 parts - List part1 = null; - List part2 = null; + int size = data.size(); - List part3 = null; - // TODO: + int part = (int)Math.ceil(size / 3.0); - StudentLoader t1 = null; - StudentLoader t2 = null; - StudentLoader t3 = null; + List part1 = + data.subList( + 0, + Math.min(part,size) + ); - // TODO: - // start() + List part2 = + data.subList( + Math.min(part,size), + Math.min(part*2,size) + ); - // join() - // merge results + List part3 = + data.subList( + Math.min(part*2,size), + size + ); + + + + StudentLoader t1 = + new StudentLoader(part1); + + + StudentLoader t2 = + new StudentLoader(part2); + + + StudentLoader t3 = + new StudentLoader(part3); + + + + t1.start(); + + t2.start(); + + t3.start(); + + + + t1.join(); + + t2.join(); + + t3.join(); + + + + + ArrayList finalList = + new ArrayList<>(); + + + finalList.addAll(t1.getStudents()); + + finalList.addAll(t2.getStudents()); + + finalList.addAll(t3.getStudents()); + + + + manager.addStudents(finalList); + + + + System.out.println( + "Students loaded: " + + finalList.size() + ); + } + + case 2 -> { + System.out.print("ID: "); + int id = scanner.nextInt(); - System.out.println(manager.searchStudent(id)); + + + Student student = + manager.searchStudent(id); + + + + if(student != null){ + + System.out.println("Found:"); + + System.out.println(student); + + } + + else{ + + System.out.println("Student not found."); + + } + } + + case 3 -> { + System.out.print("ID: "); + int id = scanner.nextInt(); - boolean removed = manager.removeStudent(id); - System.out.println(removed); + System.out.println( + manager.removeStudent(id) + ); + } - case 4 -> - manager.printStudents(); + + + case 4 -> { + + + manager.printStudents(); + + + } + + case 5 -> { + + return; + + } + } } diff --git a/src/main/java/dev/model/Student.java b/src/main/java/dev/model/Student.java index f0484f4..f626ed4 100644 --- a/src/main/java/dev/model/Student.java +++ b/src/main/java/dev/model/Student.java @@ -3,18 +3,11 @@ package dev.model; public class Student { private final int id; - private final String name; - private final String major; - private final double gpa; - public Student( - int id, - String name, - String major, - double gpa) { + public Student(int id, String name, String major, double gpa) { this.id = id; this.name = name; @@ -38,35 +31,35 @@ public class Student { return gpa; } + @Override public int hashCode() { - // TODO: - // Return custom hash - - // Example: - // return id % 97; - - return 0; + return id % 97; } + @Override public boolean equals(Object obj) { - // TODO: + if (obj == null) { + return false; + } - // Step 1: - // Check null + if (this == obj) { + return true; + } - // Step 2: - // Convert obj to Student + if (getClass() != obj.getClass()) { + return false; + } - // Step 3: - // Compare IDs + Student other = (Student) obj; - return false; + return id == other.id; } + @Override public String toString() { @@ -77,5 +70,4 @@ public class Student { ", gpa=" + gpa + '}'; } - } \ No newline at end of file diff --git a/src/main/java/dev/service/StudentManager.java b/src/main/java/dev/service/StudentManager.java index 403a1c6..a629ca0 100644 --- a/src/main/java/dev/service/StudentManager.java +++ b/src/main/java/dev/service/StudentManager.java @@ -4,46 +4,58 @@ import dev.model.Student; import java.util.ArrayList; - public class StudentManager { + private final ArrayList students = new ArrayList<>(); + public void addStudents(ArrayList newStudents) { - // TODO: - - // Merge students - - // Hint: - // addAll() + students.addAll(newStudents); } + public Student searchStudent(int id) { - // TODO: - // Loop through students + for (Student student : students) { + + + if (student.getId() == id) { + + return student; + } + + } - // Compare IDs return null; } + public boolean removeStudent(int id) { - // TODO: - // Find student + Student student = searchStudent(id); + + + if (student != null) { + + students.remove(student); + + return true; + } - // Remove student return false; } + public void printStudents() { + for (Student student : students) { System.out.println(student); diff --git a/src/main/java/dev/thread/StudentLoader.java b/src/main/java/dev/thread/StudentLoader.java index ab47522..3ed21fd 100644 --- a/src/main/java/dev/thread/StudentLoader.java +++ b/src/main/java/dev/thread/StudentLoader.java @@ -1,56 +1,58 @@ package dev.thread; - import dev.model.Student; import java.util.ArrayList; import java.util.List; + public class StudentLoader extends Thread { - // Assigned file lines private final List lines; - // Local student storage private final ArrayList students = new ArrayList<>(); + public StudentLoader(List lines) { this.lines = lines; } + @Override public void run() { - // TODO: - - /* - Example line: - - 1001,Aryan,Computer Science,3.7 - */ for (String line : lines) { - // TODO: - // split line - // TODO: - // read values + String[] data = line.split(","); - // TODO: - // create Student - // TODO: - // add to students list + int id = Integer.parseInt(data[0]); + + String name = data[1]; + + String major = data[2]; + + double gpa = Double.parseDouble(data[3]); + + + Student student = + new Student(id, name, major, gpa); + + + students.add(student); } + } + public ArrayList getStudents() { return students; diff --git a/src/main/java/dev/utils/FileManager.java b/src/main/java/dev/utils/FileManager.java index da7f6f5..6ac1891 100644 --- a/src/main/java/dev/utils/FileManager.java +++ b/src/main/java/dev/utils/FileManager.java @@ -1,31 +1,46 @@ package dev.utils; + import java.io.BufferedReader; import java.io.FileReader; - import java.util.ArrayList; import java.util.List; + public class FileManager { - public static List loadStudents(String path) throws Exception { + + public static List loadStudents(String path) + throws Exception { + List lines = new ArrayList<>(); - BufferedReader reader = new BufferedReader(new FileReader(path)); + + BufferedReader reader = + new BufferedReader( + new FileReader(path) + ); + String line; + while ((line = reader.readLine()) != null) { - // TODO: - // Add line to list + if (!line.isEmpty()) { + + lines.add(line); + + } } + reader.close(); + return lines; } diff --git a/src/main/java/lecture/multithreading/basics/JoinSimpleExample.java b/src/main/java/lecture/multithreading/basics/JoinSimpleExample.java index 4849634..7831664 100644 --- a/src/main/java/lecture/multithreading/basics/JoinSimpleExample.java +++ b/src/main/java/lecture/multithreading/basics/JoinSimpleExample.java @@ -25,7 +25,7 @@ public class JoinSimpleExample { System.out.println("The main thread waits until the worker finishes..."); try { - worker.join(); // The main thread stops here until the worker finishes + worker.join(); } catch (InterruptedException e) { e.printStackTrace(); } diff --git a/src/main/java/lecture/multithreading/timeout/Main.java b/src/main/java/lecture/multithreading/timeout/Main.java index 8258073..1d75d93 100644 --- a/src/main/java/lecture/multithreading/timeout/Main.java +++ b/src/main/java/lecture/multithreading/timeout/Main.java @@ -1,10 +1,36 @@ package lecture.multithreading.timeout; - - public class Main { - public static void main(String[] args) { - // TODO + public static void main(String[] args) throws InterruptedException { + + Thread worker = new Thread(new Runnable() { + @Override + public void run() { + System.out.println("👷 Worker started..."); + try { + Thread.sleep(10000); // Runs for 10 seconds + } catch (InterruptedException e) { + System.out.println("🛑 Worker was interrupted!"); + } + System.out.println("👷 Worker finished!"); + } + }); + + worker.start(); + + System.out.println("Main: waiting max 3 seconds for worker..."); + + // join with timeout (in milliseconds) + worker.join(3000); + + if (worker.isAlive()) { + System.out.println("⏰ Timeout reached! Worker is still running."); + System.out.println("Main: I'm not waiting anymore, continuing..."); + } else { + System.out.println("Worker finished before timeout."); + } + + System.out.println("Main thread continues its own work now."); } }