Khi một chương trình Java khởi chạy, JVM sẽ tạo ra một thread gọi là main thread, đây là nơi thực thi chương trình. Ngoài main thread, chúng ta có thể tạo thêm các thread khác tùy theo nhu cầu sử dụng. Khi sử dụng các phương thức như wait(), join(), sleep() để đồng bộ hóa, chúng ta cần biết thread đang ở trong trạng thái nào. Trong bài viết này, chúng ta sẽ tìm hiểu về vòng đời của một thread, các trạng thái mà nó trải qua trước khi kết thúc.
Các Trạng Thái trong Vòng Đời của Thread trong Java
Một thread có các trạng thái sau:
- NEW (Tạo Mới): Trạng thái khi
threadmới được tạo, trước khi gọistart(). - RUNNABLE (Đang Thực Thi):
Threadsẵn sàng để chạy sau khi gọistart(). - BLOCKED (Bị Chặn):
Threadbị chặn khi cố gắng truy cập một đoạn mã đang được chiếm bởithreadkhác hoặc khi chờ tài nguyên I/O. - WAITING (Chờ):
Threadchờ vô thời hạn khi gọiwait()hoặc chờ với thời gian xác định khi gọisleep(). - TIMED_WAITING (Chờ Với Thời Gian Xác Định):
Threadchờ với thời gian xác định khi gọiwait(timeout)hoặcsleep(timeout). - TERMINATED (Chấm Dứt):
Threadkết thúc sau khi thực thi xong hoặc xảy ra ngoại lệ.
Sơ đồ enum dưới đây thể hiện các trạng thái trong vòng đời của một Thread:

Trạng Thái "NEW" (Tạo Mới)
Khi một thread được tạo nhưng chưa gọi start(), nó ở trạng thái "NEW".

Trạng Thái "RUNNABLE" (Đang Thực Thi)
Khi gọi start(), thread chuyển sang trạng thái "RUNNABLE", và hệ thống sẽ quản lý việc thực thi thread này.

Trạng Thái "BLOCKED" (Bị Chặn) và "WAITING" (Chờ)
Khi một thread chờ tài nguyên hoặc bị chặn khi truy cập vào đoạn mã đang được chiếm bởi thread khác, nó có thể ở trong trạng thái "BLOCKED". Khi thread gọi wait() hoặc sleep(), nó có thể chuyển sang trạng thái "WAITING". Khi các điều kiện thỏa mãn, thread sẽ trở lại "RUNNABLE".

Trạng Thái "TIMED_WAITING" (Chờ Với Thời Gian Xác Định)
Khi thread gọi wait(timeout) hoặc sleep(timeout), nó chuyển sang trạng thái "TIMED_WAITING". Sau thời gian chờ, thread sẽ trở lại "RUNNABLE".
Trạng Thái "TERMINATED" (Chấm Dứt)
`
Thread` kết thúc sau khi thực thi xong hoặc xảy ra ngoại lệ.

Ví Dụ Vòng Đời của Thread trong Java
Dưới đây là một ví dụ minh họa vòng đời của Thread:
java
class MyThread implements Runnable {
public void run() {
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Trạng thái của thread1 sau khi gọi join() trên thread2 - " +
Main.thread1.getState());
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class Main implements Runnable {
public static Thread thread1;
public static Main obj;
public static void main(String[] args) {
obj = new Main();
thread1 = new Thread(obj);
System.out.println("Trạng thái của thread1 sau khi tạo - " + thread1.getState());
thread1.start();
System.out.println("Trạng thái của thread1 sau khi gọi start() - " +
thread1.getState());
}
public void run() {
MyThread myThread = new MyThread();
Thread thread2 = new Thread(myThread);
System.out.println("Trạng thái của thread2 sau khi tạo - " + thread2.getState());
thread2.start();
System.out.println("Trạng thái của thread2 sau khi gọi start() - " +
thread2.getState());
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Trạng thái của thread2 sau khi gọi sleep() - " +
thread2.getState());
try {
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Trạng thái của thread2 sau khi kết thúc - " +
thread2.getState());
}
}
Kết quả
Trạng thái của thread1 sau khi tạo - NEW
Trạng thái của thread1 sau khi gọi start() - RUNNABLE
Trạng thái của thread2 sau khi tạo - NEW
Trạng thái của thread2 sau khi gọi start() - RUNNABLE
Trạng thái của thread2 sau khi gọi sleep() - TIMED_WAITING
Trạng thái của thread1 sau khi gọi join() trên thread2 - WAITING
Trạng thái của thread2 sau khi kết thúc - TERMINATED
Trên đây là ví dụ về vòng đời của một Thread trong Java, chúng ta đã thấy các trạng thái khác nhau mà một Thread có thể trải qua trong quá trình thực thi. Hiểu về vòng đời của Thread là quan trọng để quản lý và đồng bộ hóa các Thread trong ứng dụng của bạn.