Trong Java, thread là một phần quan trọng của lập trình đa luồng, cho phép thực hiện nhiều tác vụ đồng thời. Mỗi thread trong Java có thể ở nhiều trạng thái khác nhau trong suốt vòng đời của nó. Mỗi trạng thái phản ánh một bước trong quá trình thực thi của thread. Bài viết này sẽ giải thích các trạng thái của thread ở mức cao, bao gồm các khái niệm cơ bản và các trạng thái chính mà một thread có thể trải qua.

1. Các trạng thái chính của thread

1.1. New (Mới)

  • Mô tả: Đây là trạng thái ban đầu của một thread khi nó được tạo ra nhưng chưa được chạy. Thread ở trạng thái này được khởi tạo thông qua việc tạo một đối tượng từ lớp Thread hoặc thông qua một đối tượng thực hiện Runnable. Trong trạng thái này, thread chưa được cấp phát tài nguyên để chạy.
  • Ví dụ:
Thread thread = new Thread(new MyRunnable()); // Thread ở trạng thái New

1.2. Runnable (Đang chạy)

  • Mô tả: Khi thread đã được gọi phương thức start(), nó chuyển sang trạng thái Runnable. Trong trạng thái này, thread có thể đang chạy hoặc đang chờ CPU để thực thi. Điều này có nghĩa là thread có thể không phải lúc nào cũng đang chạy, nhưng nó có khả năng chạy.
  • Ví dụ:
thread.start(); // Thread chuyển sang trạng thái Runnable

1.3. Blocked (Bị chặn)

  • Mô tả: Thread chuyển sang trạng thái Blocked khi nó đang chờ một lock (khóa) để có thể thực thi một đoạn mã mà nó không thể truy cập. Điều này xảy ra khi một thread cố gắng truy cập vào một phần mã mà đã bị khóa bởi một thread khác. Thread sẽ bị chặn cho đến khi khóa đó được giải phóng.
  • Ví dụ:
synchronized (someObject) {
    // Code mà thread đang cố gắng thực thi
}

1.4. Waiting (Đang chờ)

  • Mô tả: Thread chuyển sang trạng thái Waiting khi nó đang chờ một điều kiện cụ thể để tiếp tục thực thi. Điều này có thể xảy ra khi thread gọi các phương thức như wait(), join(), hoặc LockSupport.park(). Thread sẽ không tiêu tốn tài nguyên CPU khi ở trạng thái này.
  • Ví dụ:
synchronized (someObject) {
    someObject.wait(); // Thread chuyển sang trạng thái Waiting
}

1.5. Timed Waiting (Đang chờ có giới hạn thời gian)

  • Mô tả: Tương tự như trạng thái Waiting, nhưng thread trong trạng thái này sẽ chỉ chờ một khoảng thời gian nhất định. Sau khi thời gian chờ hết, thread sẽ trở lại trạng thái Runnable. Điều này xảy ra khi thread gọi các phương thức như sleep(millis), wait(millis), hoặc join(millis).
  • Ví dụ:
Thread.sleep(1000); // Thread sẽ ngủ trong 1000ms

1.6. Terminated (Kết thúc)

  • Mô tả: Khi một thread hoàn tất công việc của nó, nó sẽ chuyển sang trạng thái Terminated. Trong trạng thái này, thread không thể được khởi động lại. Có thể xảy ra khi phương thức run() của thread hoàn tất, hoặc do một ngoại lệ không được xử lý.
  • Ví dụ:
public void run() {
    // Code thực thi
} // Khi code này kết thúc, thread sẽ ở trạng thái Terminated

2. Tóm tắt vòng đời của thread

Vòng đời của thread trong Java rất đa dạng và phản ánh khả năng thực thi song song trong các ứng dụng. Các trạng thái New, Runnable, Blocked, Waiting, Timed Waiting và Terminated giúp quản lý các thread và tài nguyên hệ thống một cách hiệu quả.