Thread--------------------------------------------Mục lục
Threads
(Luồng) cho phép hoạt động hiệu quả hơn bằng cách chạy nhiều thứ cùng lúc
💡 Sử dụng để thực thi các tác vụ phức tạp trong nền mà không làm gián đoạn chương trình chính
Có 2 cách để tạo Thread
:
-
Sử dụng bằng cách kế thừa lớp
Thread
và đè phương thứcrun()
như sau:public class Main extends Thread{ public void run(){ System.out.println("Code đang chạy luồng run"); } }
-
Cách khác ➨ Bổ sung từ interface
Runnable
như sau :public class Main implements Runnable{ public void run(){ System.out.println("Code đang chạy luồng run"); } }
Phương thức | mô tả |
---|---|
run() | |
start() | |
- Nếu bạn sử dụng cách kế thừa lớp
Thread
, ta có thể chạy luồng bằng cách sử dụng phương thứcstart()
:
public class Main extends Thread {
public static void main(String[] args) {
Main thread = new Main();
thread.start();
System.out.println("Code này nằm bên ngoài luồng");
}
public void run() {
System.out.println("Code này đang chạy trong luồng");
}
}
/* Code này đang chạy trong luồng
Code này nằm bên ngoài luồng */
-
Nếu sử dụng bổ sung interface
Runnable
, thì ta phải tạo đối tượngThread
và gọi phương thứcstart()
như sau :public class Main implements Runnable { public static void main(String[] args) { Main obj = new Main(); Thread thread = new Thread(obj); thread.start(); System.out.println("Code này nằm bên ngoài luồng"); } public void run() { System.out.println("Code này đang chạy trong luồng"); } } /* Code này đang chạy trong luồng Code này nằm bên ngoài luồng */
Trả lời
Điểm chính khác nhau là khi bạn dùng kế thừa lớp Thread
, bạn không thể kế thừa lớp nào khác, còn bổ sung interface Runnable
thì có thể.
Như bạn đã biết thì Thread
sẽ chạy song song với chương trình, vậy thì làm sao nó có thể biết thứ tự chạy của từng Thread
, vấn đề đó gọi là
🔥 Ví dụ khi chương trình
threads
vàmain
cùng đọc và ghi biếnx
thì sẽ xảy ra lỗi không mong muốn vì thứ tự thực hiện.
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++;
}
}
// 0 2
Như các bạn đã thấy, thì lỗi và khi cố chạy nó sẽ không cho ta kết quả mong muốn !!!
Để giải quyết vấn đề này, cách tốt nhất là bạn hạn chế sử dụng attribute
chung cho hàm thread
và main
. Nếu bắt buộc phải sử dụng, hãy sử dụng phương thức isAlive()
như sau :
public class Main extends Thread{
public static int amount = 0;
public static void main(String[] args){
Main thread = new Main();
thread.start();
while(thread.isAlive()){
System.out.println("Đợi xử lý xong đã");
}
System.out.println("Amount = " + amount);
amount++;
System.out.println("Amount = " + amount);
}
public void run(){
amount++;
}
}
// Đợi xử lý xong đã
// Amount = 1;
// Amount = 2;