Thread là gì? Tất tần tật các thông tin cần biết khi làm IT 

Thread là gì? Hay còn gọi là luồng hiểu căn bản trong quá trình Lập trình là một tiến trình con (sub-process). Thuật ngữ này thường đi kèm với Java và các luồng được quản lý bởi máy ảo Java. Chúng ta hãy cùng Xuyên Việt Media tìm hiểu kỹ hơn về cụm từ này trong bài viết dưới đây.

Thread là gi?

Tìm hiểu về tính chất cơ bản của Thread trong Java?

Thread hay còn gọi là luồng, là đơn vị nhỏ nhất trong Java, mỗi Thread sẽ thực hiện một công việc hoàn toàn riêng biệt và được quản lý bởi máy ảo Java (Java Virtual Machine).

Java chính là một ngôn ngữ lập trình đa phân luồng (multithreaded). Thread kế thừa ý tưởng của đa nhiệm trong các ứng dụng để bạn có thể chia nhỏ các hoạt động riêng biệt bên trong một ứng dụng đơn thành các luồng (thread) riêng lẻ. Mỗi một thread có thể chạy song song riêng biệt với nhau.

Chu trình đời của một thread là gì?

Vòng đời của một thread là gì? Sau đây chúng tôi sẽ cung cấp chi tiết vòng đời chi tiết của một luồng trong Java để bạn đọc hiểu rõ 

  • New : Đây là trạng thái khi luồng vừa được khởi tạo bằng phương thức khởi tạo của lớp Thread nhưng chưa được start(). Ở trạng thái này, luồng được tạo ra nhưng chưa được cấp phát tài nguyên và cũng chưa chạy. Nếu luồng đang ở trạng thái này mà ta gọi các phương thức ép buộc stop, resume, suspend … sẽ là nguyên nhân xảy ra ngoại lệ IllegalThreadStateException .
  • Runnable : Sau khi gọi phương thức start() thì luồng test đã được cấp phát tài nguyên và các lịch điều phối CPU cho luồng test cũng bắt đầu có hiệu lực. Ở đây, chúng ta dùng trạng thái là Runnable chứ không phải Running, vì luồng không thực sự luôn chạy mà tùy vào hệ thống mà có sự điều phối CPU khác nhau.
  • Waiting: Thread chờ không giới hạn cho đến khi một luồng khác đánh thức nó.
  • Dead Thread vào trạng thái này khi thi hành xong tác vụ.
Vòng đời chi tiết của một luồng trong Java
Vòng đời chi tiết của một luồng trong Java

Ưu điểm và nhược điểm của Thread trong Java

Cụ thể những ưu nhược điểm của thread là gì? Ở nội dung này chúng ta sẽ cùng tìm hiểu về chúng: 

Ưu điểm

  • Nó không chặn người sử dụng vì các luồng là độc lập và bạn có thể thực hiện nhiều công việc cùng một lúc.
  • Mỗi luồng có thể dùng chung và chia sẻ nguồn tài nguyên trong quá trình chạy, nhưng có thể thực hiện một cách độc lập.
  • Luồng là độc lập vì vậy nó không ảnh hưởng đến luồng khác nếu ngoại lệ xảy ra trong một luồng duy nhất.
  • Có thể thực hiện nhiều hoạt động với nhau để tiết kiệm thời gian. Ví dụ một ứng dụng có thể được tách thành : luồng chính chạy giao diện người dùng và các luồng phụ nhiệm gửi kết quả xử lý đến luồng chính.

Nhược điểm

  • Càng nhiều luồng thì xử lý càng phức tạp.
  • Xử lý vấn đề về tranh chấp bộ nhớ, đồng bộ dữ liệu khá phức tạp.
  • Cần phát hiện tránh các luồng chết (deadlock), luồng chạy mà không làm gì trong ứng dụng cả.

Những quyền được ưu tiên của Thread là gì trong Java?

Mỗi một Thread đều có quyền ưu tiên nhất định để giúp cho hệ điều hành xác định chính xác thứ tự thread nào được xử lý trước, thread nào được xử lý sau.

Các thread có quyền ưu tiên cao hơn, quan trọng hơn sẽ được hệ thống java cấp phát bộ nhớ và thời gian để được xử lý trước. Và trong Java, quyền ưu tiên này được thể hiện ở một dãy giữa Min-Priority (được xem là hằng số 1) và Max-Priority (hằng số 10). Và theo mặc định, mỗi một Thread sẽ được cung cấp một quyền ưu tiên Norm-Priority (hằng số 5).

Để có thể hiểu hơn về cách thức hoạt động của một thread trong Java như thế nào, các bạn hãy quan sát đoạn code sau, các thread này được tạo ra khi triển khai Runnable Interface trong Java.

Những quyền được ưu tiên của Thread là gì trong Java?
Những quyền được ưu tiên của Thread là gì trong Java?

Phương thức quan trọng tích hợp sẵn trong lớp Thread

  • public void start(): Bắt đầu thread trong một path riêng rẽ, sau đó triệu hồi phương thức run() trên đối tượng Thread này
  • public void run(): Nếu đối tượng Thread này được khởi tạo bởi sử dụng một đối tượng Runnable, phương thức run() sẽ được triệu hồi 
  • public final void setName(String name): Thay đổi tên của đối tượng Thread. Cũng có một phương thức getName() để thu nhận tên này
  • public final void setPriority(int priority): Thiết lập quyền ưu tiên của đối tượng Thread này. Giá trị có thể có nằm trong khoảng từ 1 tới 10
  • public final void setDaemon(boolean in): Một tham số true chứng tỏ Thread này như là một Daemon thread
  • public final void join(long millis): Thread hiện tại triệu hồi phương thức này trên thread thứ hai, làm cho Thread hiện tại block tới khi thread thứ hai kết thúc hoặc sau một số lượng mili giây đã xác định
  • public void interrupt(): Ngắt thread này, làm cho nó tiếp tục thực thi nếu nó bị block vì bất cứ lý do gì
  • public final boolean isAlive(): Trả về true nếu thread này là alive, mà là bất cứ thời gian nào sau khi thread này đã được bắt đầu nhưng trước khi nó run tới khi kết thúc
  • public static void yield(): Làm cho thread đang chạy hiện tại chuyển tới bất kỳ thread nào khác có cùng quyền ưu tiên mà đang đợi để được ghi lịch trình
  • public static void sleep(long millis): Làm cho thread đang chạy hiện tại block trong ít nhất một số lượng mili giây đã xác định
  • public static boolean holdsLock(Object x): Trả về true nếu thread giữ lock trên Object đãcho
  • public static Thread currentThread(): Trả về một tham chiếu tới thread đang chạy hiện tại, mà là thread mà triệu hồi phương thức này
  • public static void dumpStack(): In ra stack trace cho thread đang chạy hiện tại.

Xem thêm:

Lời kết

Với toàn bộ các thông tin trong bài viết trên đây chúng tôi đã giúp các bạn tiếp cận khá nhiều những kiến thức mới mẻ về thread là gì. Hy vọng rằng các bạn sẽ có được những thông tin thú vị và hãy tìm hiểu nhiều hơn ở các bài viết khác của chúng tôi tại Xuyên Việt Media.

duy
duy

Cảm nhận về bài viết

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Bài viết liên quan