Tìm hiểu Thread và Thread pool trong Java phần 1

3 min read

Trong lập trình đa luồng (multithreading), có lẽ chúng ta đã quá quen thuộc với khái niệm thread. Vậy còn Thread pool là gì? Và nó liên quan gì đến Thread. Chúng ta sẽ tìm hiểu trong bài này.

Thread là gì?

Luồng (thread) trong Java là một đơn vị xử lý độc lập trong chương trình, cho phép thực hiện đa luồng (multithreading) để cải thiện hiệu suất và tận dụng tối đa tài nguyên máy tính. Mỗi luồng là một dòng thực thi độc lập trong chương trình, có thể chạy song song với các luồng khác.

Việc sử dụng đa luồng cho phép các tác vụ được thực thi đồng thời, giúp tăng cường hiệu suất của ứng dụng. Cụ thể, khi một tác vụ chậm hoặc bị chặn, các luồng khác vẫn có thể tiếp tục thực thi, giữ cho ứng dụng luôn phản hồi.

Điều này đặc biệt hữu ích trong các ứng dụng đòi hỏi xử lý nhiều công việc cùng một lúc, như ứng dụng web hoặc game đa người chơi.

Mỗi chương trình Java chạy ít nhất là một luồng được gọi là “main thread” và từ đó, nó cũng có thể tạo, quản lý các luồng khác cho đa luồng tác vụ.

Vòng đời của Thread

Vòng đời của Thread

New

Khi một Thread mới được khởi tạo nhưng chưa bắt đầu chạy, nó ở trạng thái “New”. Ở trạng thái này, Thread chưa được liên kết với hệ thống phân bổ tài nguyên, và chưa được đưa vào hàng đợi CPU. Để bắt đầu chạy một luồng mới, bạn cần gọi phương thức start() của Thread đó.

Runnable

Khi một Thread đã được khởi động bằng phương thức start(), nó chuyển sang trạng thái “Runnable”. Ở trạng thái này, Thread đang chờ đợi CPU để thực thi mã của nó. Trạng thái Runnable không đảm bảo rằng Thread đang thực sự chạy, mà chỉ đơn giản là nó đã sẵn sàng để thực thi và đang chờ đợi tài nguyên.

Chờ (Waiting/Blocked/Sleeping)

Trong quá trình hoạt động, một Thread có thể phải chờ một điều kiện nào đó để tiếp tục. Ví dụ, Thread có thể chờ một Thread khác hoàn thành công việc, hoặc chờ một tài nguyên được giải phóng. Khi một Thread ở trạng thái “Waiting”, nó không thực thi mã của nó và giải phóng tài nguyên CPU để các Thread khác có thể sử dụng.

Bạn có thể sử dụng các phương thức như wait(), join(), hoặc LockSupport.park() để đưa một Thread vào trạng thái Waiting.

Trạng thái “Sleeping” là khi một Thread đang ngủ trong một khoảng thời gian xác định, sau đó tự động chuyển sang trạng thái Runnable. Khi một Thread ở trạng thái Sleeping, nó không thực thi mã của nó và giải phóng tài nguyên CPU.

Để đưa một luồng vào trạng thái Sleeping, bạn có thể sử dụng phương thức sleep().

Running

Thread đang thực hiện công việc nhờ sử dụng tài nguyên được hệ thống cấp phát.

Ở trạng thái này Thread có thể gặp lỗi dẫn đến Dead Thread ngay lập tức.

Terminated/Dead

Khi một luồng hoàn thành công việc của nó hoặc bị dừng bởi một lý do nào đó, nó chuyển sang trạng thái “Terminated”. Khi một Thread ở trạng thái này, nó không thể tái sử dụng, và bạn cần tạo một Thread mới nếu muốn thực hiện lại công việc đó.

Một số lý do dẫn đến trạng thái Terminated:

  • Mã trong phương thức run() của Thread đã hoàn thành.
  • Thread gặp phải một ngoại lệ không được xử lý trong phương thức run().
  • Phương thức stop() được gọi để dừng Thread (lưu ý: phương thức này đã bị loại bỏ và không nên sử dụng).
Ở những phần tiếp theo chúng ta sẽ tìm hiểu về Thread pool, cách hoạt động và lợi ích của Thread pool.

Reference:
Đồng bộ bất đồng bộ và song song
https://rikkei.edu.vn/thread-trong-java/
https://viblo.asia/p/tim-hieu-ve-thread-pool-trong-java-OeVKBDQMlkW
http://www.btechsmartclass.com/java/java-thread-model.html
Avatar photo

4 Replies to “Tìm hiểu Thread và Thread pool trong Java phần 1”

Leave a Reply

Your email address will not be published. Required fields are marked *