Hiểu vòng đời của Thread trong Java là rất quan trọng khi khi bạn làm việc với Thread và lập trình trong môi trường đa luồng (multithreaded).
Trong bài trước, chúng ta đã biết có thể tạo một Java Thread bằng cách implement interface Runnable hoặc kế thừa class Thread. Tuy nhiên, để bắt đầu một thread, trước tiên chúng ta phải tạo ra đối tượng Thread và gọi phương thức start() của nó để thực thi phương thức run() như một luồng riêng biệt.
Vòng đời của Thread trong Java
Sơ đồ dưới đây cho thấy các trạng thái khác nhau của vòng đời thread trong Java. Chúng ta có thể tạo một thread trong Java và khởi động nó, nhưng cách trạng thái của thread thay đổi từ Runnable sang Running rồi Blocked tùy thuộc vào cách hệ điều hành triển khai bộ lập lịch thread (thread scheduler), và Java không có toàn quyền kiểm soát điều đó.
New (Mới tạo)
Khi chúng ta tạo một đối tượng Thread mới bằng toán tử new, trạng thái của thread sẽ là New. Ở giai đoạn này, thread chưa “sống” (not alive) và đây chỉ là một trạng thái nội bộ trong lập trình Java, nghĩa là thread vẫn chưa được JVM đưa vào hàng đợi để chạy.
Runnable (Sẵn sàng chạy)
Khi chúng ta gọi phương thức start() trên đối tượng Thread, trạng thái của thread sẽ chuyển sang Runnable. Lúc này, quyền điều khiển được trao cho Thread Scheduler để sắp xếp việc thực thi thread. Việc thread được chạy ngay lập tức hay phải nằm chờ trong Runnable Pool trước khi được chạy sẽ phụ thuộc vào cách hệ điều hành (OS) triển khai Thread Scheduler.
Running (Đang chạy)
Khi một thread đang thực thi, trạng thái của nó sẽ chuyển sang Running. Thread Scheduler sẽ chọn một thread từ Runnable Pool và đổi trạng thái của nó thành Running, sau đó CPU bắt đầu thực hiện thread này. Một thread có thể chuyển từ trạng thái Running sang Runnable, Dead hoặc Blocked tùy thuộc vào cơ chế chia thời gian (time slicing), việc hoàn thành phương thức run() hoặc việc phải chờ một số tài nguyên để tiếp tục.
Blocked/Waiting (Bị chặn/Chờ)
Một thread có thể ở trạng thái chờ khi đợi một thread khác hoàn thành bằng cách sử dụng join hoặc khi chờ tài nguyên sẵn sàng. Ví dụ như trong bài toán Producer Consumer, cơ chế wait/notify, hoặc khi chờ tài nguyên IO, trạng thái của thread sẽ chuyển sang Waiting. Khi thời gian chờ kết thúc hoặc tài nguyên đã sẵn sàng, trạng thái sẽ chuyển về Runnable và thread được đưa lại vào Runnable Pool.
Dead (Kết thúc)
Khi một thread hoàn tất việc thực thi, trạng thái của nó sẽ chuyển sang Dead và được coi là không còn sống. Trên đây là các trạng thái khác nhau của thread; việc hiểu rõ chúng và cách một thread thay đổi trạng thái sẽ giúp bạn lập trình đa luồng hiệu quả hơn. Đây là toàn bộ nội dung về vòng đời của thread trong Java.