Đa luồng trong Java - Tìm hiểu về lập trình đa luồng trong Java
11/06/2021 01:23
Đa luồng là một tính năng quan trọng khác của lập trình hướng đối tượng. Đa luồng trong Java giúp lập trình viên thực thi nhiều hơn hai chương trình đồng thời và chúng ta có thể tận dụng khả năng cua CPU. Trong hướng dẫn này, chúng ta sẽ tìm hiểu về đa luồng trong Java và những lợi thế của việc sử dụng nó và cách triển khai đa luồng trong Java.
Đa luồng trong Java là gì?
Một luồng chỉ là một phần nhẹ và nhỏ nhất của một quy trình. Nó là đơn vị nhỏ nhất của một quy trình có thể chạy đồng thời với các phần khác (các luồng khác) của cùng một quy trình.
Trong một ứng dụng có nhiều quy trình, mỗi quy trình có thể có một luồng duy nhất hoặc nhiều luồng. Đa luồng là quá trình thực hiện đồng thời nhiều luồng.
Đa luồng trong Java là gì?
Có một vùng nhớ chung cho tất cả các luồng của một tiến trình nhưng mỗi luồng lại độc lập với nhau vì chúng đều có các đường dẫn thực thi riêng biệt. Do đó, nếu một ngoại lệ xảy ra trong một luồng, nó không ảnh hưởng đến việc thực thi các luồng khác.
>>> Tham khảo: Khóa học lập trình Java
Đa nhiệm so với Đa luồng so với Đa xử lý so với Đa chương trình
Bạn có thể nhầm lẫn đa luồng với đa nhiệm, đa luồng, đa xử lý và đa chương trình. Hãy so sánh ngắn gọn chúng để hiểu rõ chúng hơn.
Đa nhiệm: Đa nhiệm là khả năng của Hệ điều hành để thực thi nhiều hơn một nhiệm vụ hoặc công việc đồng thời trên một tài nguyên được chia sẻ.
Đa luồng: Đa luồng là khả năng của Hệ điều hành thực thi nhiều luồng cùng một lúc. Ở đây, một quy trình duy nhất được chia thành nhiều luồng.
Đa xử lý: Nó tương tự như đa nhiệm nhưng ở đây có nhiều hơn một bộ xử lý hoặc CPU. Do đó, nhiều quá trình có thể thực thi nhiều bộ xử lý cùng một lúc.
Đa chương trình: Đa chương trình là khả năng chạy nhiều chương trình cùng lúc trong một máy duy nhất.
>>> Đọc thêm: Định danh trong Java - Quy tắc định danh trong Java
Ưu tiên luồng trong Java
Với việc tạo luồng Java, JVM sẽ gán cho nó một số ưu tiên giúp hệ điều hành xác định thứ tự lập lịch cho các luồng. Chúng ta cũng có thể đặt mức độ ưu tiên của luồng một cách rõ ràng. Phạm vi hợp lệ của mức độ ưu tiên của một luồng là từ 1 -10. Các luồng có mức độ ưu tiên cao hơn nên được phân bổ trước các luồng có mức độ ưu tiên thấp hơn.
Ưu tiên luồng trong Java
3 hằng số xác định Ưu tiên
Có 3 loại biến hoặc giá trị tĩnh để xác định mức độ ưu tiên của Thread. Bảng hiển thị các biến sau:
Biến |
Mô tả |
public static int MIN_PRIORITY |
Mức độ ưu tiên tối thiểu của một chuỗi có giá trị = 1 |
public static int NORM_PRIORITY |
Mức độ ưu tiên mặc định của một luồng có giá trị = 5 |
public static int MAX_PRIORITY |
Mức độ ưu tiên tối đa của một luồng có giá trị = 10 |
>>> Đọc thêm: Trình biên dịch ngược trong Java mà mọi LTV đều nằm lòng
Vòng đời của luồng trong Java
Luồng tồn tại ở nhiều trạng thái. Hình trên cho thấy nhiều giai đoạn khác nhau là luồng đó là:
- New
- Runnable
- Running
- Waiting
- Dead
Các loại trạng thái đa luồng trong Java
Trạng thái New
Luồng là trạng thái mới khi chúng ta tạo nó bằng cách sử dụng “thread class”. Nó vẫn ở trạng thái này cho đến khi chương trình bắt đầu luồng bằng cách gọi phương thức start ().
Runnable
Trong pha này, phương thức start() gọi thể hiện của luồng. Bộ lập lịch có quyền điều khiển luồng để kết thúc quá trình thực thi. Nó phục thuốc vào bộ lập lịch có chạy luồng hay không
Running
Luồng chuyển sang trạng thái đang chạy khi quá trình thực thi của nó bắt đầu. Bộ lập lịch trình chọn một luồng từ nhóm luồng và luồng bắt đầu thực thi trong ứng dụng.
Waiting
Cần có sự đồng bộ giữa các luồng vì nhiều luồng đang chạy trong ứng dụng. Do đó, một luồng phải đợi cho đến khi luồng kia kết thúc quá trình thực thi. Do đó, chúng ra nói rằng luồng đang ở trạng thái chờ.
Dead
Khi kết thúc luồng, luồng sẽ chuyển sang trạng thái khi chết.
Ưu điểm của luồng đơn
Lợi ích của việc sử dụng chủ đề là:
- Một luồng làm giảm chi phí trong ứng dụng khi một luồng chạy trong hệ thống
- Một luồng duy nhất làm giảm chi phí bảo trì của ứng dụng
- Các luồng có một vùng bộ nhớ được chia sẻ để chúng giúp tiết kiệm bộ nhớ
- Chuyển đổi ngữ cảnh giữa các luồng mất ít thời gian hơn trong quá trình
Đa luồng trong Java
Quá trình chạy nhiều hơn một luồng trong một chương trình hoặc một ứng dụng đồng thời hoặc đồng thời được gọi là đa luồng trong Java. Khi nhiều hơn hai luồng chạy đồng thời, đó là đa luồng. Do đó, chúng ta cũng có thể gọi nó là Concurrency trong Java. Đa luồng cho phép nhiều hoạt động thực thi đồng thời trong cùng một chương trình để đạt được mức sử dụng tối đa của CPU.
Như đã thảo luận ở trên, Đa nhiệm là một quá trình chạy hoặc thực thi nhiều tiến trình hoặc tác vụ cùng một lúc. Đa luồng mở rộng ý tưởng về đa nhiệm trong đó chúng ta có thể tách một ứng dụng thành từng luồng riêng lẻ và chạy từng luồng độc lập trong cùng một không gian bộ nhớ. Mỗi luồng trong một chương trình đa luồng có thể chạy song song. Hệ điều hành phân chia thời gian xử lý giữa các ứng dụng khác nhau và giữa từng luồng trong một ứng dụng.
Các phương thức của lớp luồng trong Java
Danh sách sau đây cho thấy một số phương thức quan trọng sẵn có trong lớp Thread:
STT |
Phương thức |
Mô tả |
1 |
public void start() |
Phương thức này bắt đầu thực thi luồng trong một đường dẫn riêng và sau đó gọi phương thức run () trên đối tượng Thread hiện tại. |
2 |
public void run() |
Đối tượng Runnable gọi phương thức này nếu chúng ta khởi tạo đối tượng Thread này bằng cách sử dụng đích Runnable riêng. |
3 |
public final void setName(String name) |
Phương thức này thay đổi tên của đối tượng Thread. |
4 |
public final void setPriority(int priority) |
Chúng tôi sử dụng phương thức này để thiết lập mức độ ưu tiên của đối tượng Thread này. Chúng ta có thể sử dụng các giá trị có thể từ 1 đến 10. |
5 |
public final void join(long millisec) |
Luồng hiện tại gọi phương thức này trên luồng thứ hai và khiến luồng hiện tại bị chặn cho đến khi luồng thứ hai kết thúc với số mili giây đã chỉ định trôi qua. |
6 |
public void interrupt() |
Phương thức này làm gián đoạn luồng hiện tại và khiến nó tiếp tục thực thi nếu nó đã bị chặn vì bất kỳ lý do gì. |
7 |
public final boolean isAlive() |
Nó trả về true nếu luồng còn sống hoặc vẫn đang chạy, nếu không nó trả về false |
8 |
public static void yield() |
Nó làm cho luồng hiện đang chạy nhường cho bất kỳ luồng nào khác có cùng mức độ ưu tiên đang chờ được lên lịch. |
9 |
public static void sleep(long millisec) |
Nó tạm dừng luồng hiện đang chạy trong ít nhất số mili giây được chỉ định. |
10 |
public static Thread currentThread() |
Nó trả về một tham chiếu đến luồng hiện đang chạy, tức là luồng gọi phương thức này. |
Kết luận: Trên đây là các thông tin về đa luồng trong Java. Hy vọng các thông tin trên hữu ích với bạn. Tìm hiểu thêm về Java và các ngôn ngữ lập trình khác qua các khóa học lập trình tại Viện công nghệ thông tin T3H bạn nhé!