Thread
Duy Văn | 12/03/2025
Thread trong java cũng giống như thread trong Python, nó cho phép chúng ta chạy nhiều công việc cùng một lúc, giúp tăng hiệu suất của chương trình
Ở phía Java, tạo thread có thể được làm bằng cách cho class Main kế thừa từ class Thread và override method run()
public class Main extends Thread {
public void run() {
System.out.println("Thread is running");
}
public static void main(String[] args) {
Main thread = new Main();
thread.start();
System.out.println("Outside of thread");
}
}
Một cách khác cũng gần tương tự là cho class Main sử dụng interface Runnable và implement method run()
public class Main implements Runnable {
public void run() {
System.out.println("Thread is running");
}
public static void main(String[] args) {
Main obj = new Main();
Thread thread = new Thread(obj);
thread.start();
System.out.println("Outside of thread");
}
}
Khác biệt giữa 2 phương pháp này là :
- Nếu sử dụng class Thread thì không thể kế thừa từ class khác nữa
- Nếu sử dụng interface Runnable thì có thể kế thừa từ class khác ví dụ
MyClass extends OtherClass implements Runnable
Concurency
Vấn đề phát sinh khi chạy code song song chính là vì chúng chạy cùng một lúc nên không thể biết code nào chạy trước code nào chạy sau, vì thế nếu thread đang thực hiện đọc ghi dữ liệu, hành vi của nó sẽ không thể đoán trước được, ví dụ với code sau
public class Main extends Thread {
public static int amount = 0;
public static void main(String[] args) {
Main thread = new Main();
thread.start();
System.out.println(amount);
amount++;
System.out.println(amount);
}
public void run() {
amount++;
}
}
Code trên in ra 0 và 2, rất khó đoán
Để tránh vấn đề này thì chúng ta nên hạn chế chia sẻ thuộc tính giữa các thread, nếu có thì nên sử dụng method isAlive() để kiểm tra thread đã chạy xong hay chưa trước khi sử dụng thuộc tính mà thread đang làm việc
public class Main extends Thread {
public static int amount = 0;
public static void main(String[] args) {
Main thread = new Main();
thread.start();
// Wait for the thread to finish
while(thread.isAlive()) {
System.out.println("Waiting...");
}
// Update amount and print its value
System.out.println("Main: " + amount);
amount++;
System.out.println("Main: " + amount);
}
public void run() {
amount++;
}
}
Trong ví dụ trên, chúng ta sẽ in ra Waiting... cho đến khi thread kết thúc, sau đó mới in ra giá trị của amount và đi kèm là amount++
Giờ nó sẽ in ra 1 và 2, rất dễ đoán