Skip to content

Latest commit

 

History

History
136 lines (107 loc) · 4.34 KB

12.Threads.md

File metadata and controls

136 lines (107 loc) · 4.34 KB

Thread--------------------------------------------Mục lục

1. Giới thiệu

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ức run() 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");
        }
    }

2. Sử dụng

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ức start() :
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ượng Thread và gọi phương thức start() 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    */

Language Learningpng Vậy sự khác nhau giữa 2 cách trên là gì ?

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ể.

Professor Male.png Vấn đề Đồng thời !!!

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 threadsmain cùng đọc và ghi biến x 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 threadmain. 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;