Vòng đời của luồng và trạng thái luồng - 1

"Chào, Amigo!"

"Chúng ta sẽ bắt đầu một chủ đề mới: chủ đề."

"Hãy bắt đầu nào. Hôm nay chúng ta sẽ kiểm tra các trạng thái mà một đối tượng Thread đi qua (hoặc có thể đi qua) khi một luồng đang chạy."

"Bạn có thể kể tên bao nhiêu tiểu bang ngay bây giờ, Amigo?"

"Hai. Đầu tiên là một luồng trước khi phương thức start() được gọi: đối tượng tồn tại, nhưng luồng chưa hoạt động. Và thứ hai là sau khi phương thức start() được gọi: khi luồng đang làm gì đó quan trọng."

"Bạn nói đúng - có một sự khác biệt như vậy. Những trạng thái này được gọi là mớiđang chạy , nhưng đó mới chỉ là khởi đầu."

"Đầu tiên, tại một thời điểm nào đó luồng sẽ chạy xong, nghĩa là có thể xảy ra trường hợp đối tượng luồng tồn tại, nhưng luồng không ở trạng thái mới hoặc đang chạy." Trạng thái này, nơi luồng đã chạy xong, được gọi là chấm dứt ."

"Nhưng còn nhiều hơn nữa. Đừng quên rằng tại bất kỳ thời điểm nào chỉ có một luồng đang thực sự chạy. Điều dường như là công việc đồng thời thực sự là bộ xử lý liên tục nhảy từ luồng này sang luồng khác. Có một trạng thái riêng biệt khi luồng dường như đang chạy đang chạy, nhưng thực sự đang đợi đến lượt của nó: nó được gọi là sẵn sàng chạy . Khi một luồng hoạt động, nó liên tục chuyển từ trạng thái đang chạy sang trạng thái sẵn sàng và sau đó quay lại trạng thái chạy khi hoạt động trở lại."

"Ngay sau khi phương thức start () được gọi, luồng được chỉ định trạng thái sẵn sàng chạy và được đặt trong danh sách chia sẻ các luồng mà JVM chuyển đổi giữa."

"Cái đó cũng không khó lắm. Trước khi bắt đầu chạy nó có trạng thái mới . Sau khi chạy xong thì nó kết thúc . Khi chạy thì luồng ở trạng thái chạy ; khi chờ thì ở trạng thái sẵn sàng . ."

"Sự ngắn gọn của bạn thật tuyệt vời, nhưng bạn nói đúng."

"Nhưng còn nhiều hơn thế nữa. Chuỗi có thể bị chặn. Ví dụ: khi bạn nhập một khối được đồng bộ hóa . Nếu một chuỗi đến khối mã được đánh dấu là đã đồng bộ hóa và một chuỗi khác đang sử dụng khối đó, thì chuỗi của chúng tôi sẽ chuyển sang trạng thái bị chặn và sẽ đợi để giải phóng mutex (khóa) của đối tượng."

"Đây là tình huống này với các tiểu bang trông như thế nào:"

Vòng đời của luồng và trạng thái luồng - 2

"Nhưng còn nhiều hơn nữa. Ngoài ra còn có một trạng thái riêng gọi là chờ đợi . Đây là khi một luồng không bị chặn , nhưng cũng chưa sẵn sàng . Ví dụ: khi bạn gọi phương thức nối () trên một luồng khác."

Khi chúng ta gọi hàm join() trên một đối tượng Chủ đề khác, nó giống như là chủ đề của chúng ta «tham gia» nó, nhưng trên thực tế, nó chỉ đợi chủ đề kia kết thúc.

"Ngoài ra, còn có phương thức wait () (từ bộ ba phương thức wait/notify/notifyAll), chuyển một luồng sang trạng thái chờ khi nó được gọi."

"Ái chà."

"Chờ một chút! Vẫn còn nhiều điều nữa. Ví dụ, một luồng có thể ngủ bằng cách gọi phương thức ngủ. Ngoài ra còn có một trạng thái riêng cho điều này. Nó được gọi là « chờ đợi theo thời gian ». « chờ đợi theo thời gian » có nghĩa là luồng đang chờ đợi một cáiđó cho một thời gian giới hạn. Nếu bạn gọi một phương thức chờ với một tham số, chẳng hạn như chờ (hết thời gian chờ) hoặc tham gia (hết thời gian chờ), thì chuỗi sẽ chuyển sang trạng thái chờ theo thời gian."

"Đây là sơ đồ đầy đủ:"

Vòng đời của luồng và trạng thái của luồng - 3

"Hừm. Chỉ vậy thôi sao? Hay còn 10 trạng thái thú vị hơn nữa?"

"Tạm thời là như vậy."

"Trong thực tế, bạn chỉ cần nhớ sơ đồ đầu tiên. Nó đơn giản hơn. Nhưng sơ đồ thứ hai chính xác hơn."

"Thật kỳ lạ, có rất nhiều sơ đồ trạng thái Chủ đề trên Internet và tất cả chúng đều khác nhau."

"Đó là lý do tại sao tôi đưa cho bạn sơ đồ này - nó hoàn chỉnh và chính xác nhất."

"Trong sơ đồ này, trạng thái sẵn sàng và đang chạy được kết hợp trong một khối duy nhất gọi là có thể chạy được. Bạn có biết tại sao không?"

"Không. Đây là lần đầu tiên tôi thấy một thứ như thế."

" Lớp Thread có một lớp bên trong được gọi là State , cũng như một phương thức getState() public của State ."

Ví dụ
public enum State
{
 NEW,
 RUNNABLE,
 BLOCKED,
 WAITING,
 TIMED_WAITING,
 TERMINATED;
}

"Bạn luôn có thể gọi phương thức getState () trên một đối tượng Thread , và tìm ra trạng thái hiện tại của nó. Và, tất nhiên, nó sẽ là một trong các giá trị của State enum."

"Tôi hiểu rồi. Vì vậy, các trạng thái thực nằm bên trong JVM, nhưng cũng có những trạng thái mà bạn có thể truy cập thông qua mã Java bằng phương thức State getState()."

"Và trong những trường hợp nào tôi sẽ sử dụng nó?"

"Rất có thể, không bao giờ."

"Nhưng bạn phải biết điều gì đang diễn ra bên trong các luồng. Nếu không, bạn sẽ có rất nhiều lỗi và thậm chí bạn sẽ không thể đoán được nguyên nhân gây ra chúng."

"Thêm vào đó, nhà tuyển dụng thích hỏi về trạng thái Chủ đề trong các cuộc phỏng vấn."