Hướng dẫn Java

TRANG CHỦ Java Giới thiệu Java Java Bắt đầu Cú pháp Java Nhận xét Java Các biến Java Các kiểu dữ liệu Java Truyền kiểu Java Toán tử Java Chuỗi Java Toán Java Java Booleans Java Nếu ... Khác Chuyển đổi Java Java While Loop Java cho vòng lặp Ngắt / Tiếp tục Java Mảng Java

Phương thức Java

Phương thức Java Các tham số phương pháp Java Nạp chồng phương pháp Java Phạm vi Java Đệ quy Java

Các lớp Java

Java OOP Các lớp / đối tượng Java Thuộc tính lớp Java Phương thức lớp Java Trình tạo Java Các công cụ sửa đổi Java Đóng gói Java Gói / API Java Kế thừa Java Đa hình Java Các lớp bên trong Java Tóm tắt Java Giao diện Java Java Enums Đầu vào của người dùng Java Ngày Java Java ArrayList Java LinkedList Java HashMap Java HashSet Trình lặp lại Java Các lớp Java Wrapper Các trường hợp ngoại lệ của Java Java RegEx Chủ đề Java Java Lambda

Xử lý tệp Java

Tệp Java Java Tạo / Viết tệp Java đọc tệp Java Xóa tệp

Java Cách thực hiện

Thêm hai số

Tham khảo Java

Từ khóa Java Phương thức chuỗi Java Phương pháp toán học Java

Ví dụ về Java

Ví dụ về Java Trình biên dịch Java Bài tập Java Java Quiz Chứng chỉ Java


Chủ đề Java


Chủ đề Java

Luồng cho phép một chương trình hoạt động hiệu quả hơn bằng cách thực hiện nhiều việc cùng một lúc.

Các luồng có thể được sử dụng để thực hiện 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.


Tạo một chủ đề

Có hai cách để tạo một luồng.

Nó có thể được tạo bằng cách mở rộng Threadlớp và ghi đè run() phương thức của nó:

Mở rộng cú pháp

public class Main extends Thread {
  public void run() {
    System.out.println("This code is running in a thread");
  }
}

Một cách khác để tạo một luồng là triển khai Runnablegiao diện:

Thực hiện Cú pháp

public class Main implements Runnable {
  public void run() {
    System.out.println("This code is running in a thread");
  }
}

Chủ đề đang chạy

Nếu lớp mở rộng Threadlớp, luồng có thể được chạy bằng cách tạo một thể hiện của lớp và gọi start()phương thức của nó:

Mở rộng ví dụ

public class Main extends Thread {
  public static void main(String[] args) {
    Main thread = new Main();
    thread.start();
    System.out.println("This code is outside of the thread");
  }
  public void run() {
    System.out.println("This code is running in a thread");
  }
}

Nếu lớp thực thi Runnablegiao diện, luồng có thể được chạy bằng cách chuyển một thể hiện của lớp tới phương thức Threadkhởi tạo của đối tượng và sau đó gọi phương thức của luồng start():

Triển khai ví dụ

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("This code is outside of the thread");
  }
  public void run() {
    System.out.println("This code is running in a thread");
  }
}

Sự khác biệt giữa các chuỗi "mở rộng" và "triển khai"

Sự khác biệt chính là khi một lớp mở rộng lớp Thread, bạn không thể mở rộng bất kỳ lớp nào khác, nhưng bằng cách triển khai giao diện Runnable, bạn cũng có thể mở rộng từ một lớp khác, chẳng hạn như: class MyClass extends OtherClass implements Runnable.


Vấn đề đồng thời

Bởi vì các luồng chạy cùng lúc với các phần khác của chương trình, không có cách nào để biết mã sẽ chạy theo thứ tự nào. Khi các luồng và chương trình chính đang đọc và ghi các biến giống nhau, các giá trị là không thể đoán trước. Các vấn đề do kết quả này được gọi là các vấn đề đồng thời.

Thí dụ

Một ví dụ về mã trong đó giá trị của biến số là không thể đoán trước:

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++;
  }
}

Để tránh các vấn đề về đồng thời, cách tốt nhất là chia sẻ càng ít thuộc tính giữa các luồng càng tốt. Nếu các thuộc tính cần được chia sẻ, một giải pháp khả thi là sử dụng isAlive() phương thức của luồng để kiểm tra xem luồng đã chạy xong chưa trước khi sử dụng bất kỳ thuộc tính nào mà luồng có thể thay đổi.

Thí dụ

Sử dụng isAlive()để ngăn chặn các vấn đề đồng thời:

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++;
  }
}