Là một kỹ sư phụ trợ, chúng tôi phải đối mặt với các tình huống xử lý dữ liệu không đồng bộ. Hôm nay chúng ta hãy xem nó được thực hiện như thế nào trong java và nhiều cách khác nhau để làm điều đó.

Thread

Thành phần rất cơ bản nhưng rất mạnh mẽ của Java concurrency là Thread. Luồng của Java thực sự được liên kết với Luồng của hệ điều hành. Cách rất cơ bản để tạo Thread là bằng cách mở rộng nó và ghi đè lên run :

Bắt đầu chuỗi gây ra run() được gọi là.
Bạn có thể yêu cầu; có, Thread có rất nhiều phương thức khác có thể được ghi đè:

  • Trong hầu hết các trường hợp, chúng tôi không muốn ghi đè các phương thức khác của luồng.
  • Khi chúng tôi mở rộng Thread lớp, lớp mở rộng mất khả năng mở rộng hơn nữa vì Java không hỗ trợ nhiều lớp kế thừa.
  • Mỗi luồng có đối tượng riêng khi chúng ta mở rộng nó, và nó không tốt cho sức khỏe bộ nhớ khi có rất nhiều Objects of the extended Thread tạo.

Java giải quyết những vấn đề này với giao diện Runnable. Trong thực tế, Thread có một phương thức được nạp chồng có Runnable.

Runnable

Runnable là một giao diện chỉ có một phương thức: run(). Có, Runnable là một giao diện chức năng và phiên bản của nó có thể được tạo bằng hàm lambda. Tuy nhiên, đó là một cách dễ dàng để làm điều này; đối với những thứ phức tạp, chúng tôi có thể muốn triển khai nó. Xem sự khác biệt ở đây. Đó là tất cả về yêu cầu:

Mặc dù Runnable có một run(), nó không phải là một Luồng mà chỉ là một lớp Java cho đến khi nó được kiểm soát bởi (được chuyển tới) Luồng. Sự bắt đầu của chuỗi làm cho đối tượng có thể chạy được run() được gọi là.

Đúng vậy, Java đã giải quyết được nó trong phiên bản 1.5 và nó có thể gọi là .

Callable<V>

Callable là một giao diện chung. Tại sao? Chạy lệnh này của giá trị trả về như lệnh chung chạy lệnh này. Callable là một giao diện quá chức năng và call() là phương thức duy nhất, một phương thức không đối số ném Exception và trả về giá trị lệnh này chạy chung.

Việc triển khai Callable rất giống với Runnable:

Xem tại đây, cuộc gọi xử lý dữ liệu và trả về một giá trị có thể được thu thập sau khi thực thi. Nhưng có một sự khác biệt lớn trong việc gọi nó? Chúng tôi sử dụng ExecutorService để gọi và Future để nắm giữ kết quả. Hãy nói về lý do tại sao.

Như bạn có thể thấy, không có hành vi nào được kiểm soát khi tạo và chạy các Luồng (Runnable hoặc Callable quá). Chúng ta có thể muốn kiểm soát số lượng luồng đang chạy tại một thời điểm vì mỗi luồng được liên kết với các luồng của hệ điều hành. Số lượng Chủ đề chúng tôi chạy phải ít hơn số lõi CPU có sẵn. Tất cả cùng nhau, Java giải quyết nó bằng cách ExecutorService giao diện.
Trên đây là bài viết thông tin về Lập trình Async trong Java: Phần I.
Vui lòng liên hệ với chúng tôi qua phần bình luận, trong trường hợp bạn có bất kỳ câu hỏi nào liên quan đến hướng dẫn mà chúng tôi đã chia sẻ ở trên.