Multithreading với Callable và Future trong Java

Multithreading là khái niệm nói về việc xử lý các tác vụ của chương trình không diễn ra trong Thread chính của chương trình mà được nhiều Thread khác nhau xử lý. Khái niệm này sẽ giúp cho việc xử lý của chương trình được nhanh hơn. Chúng ta có nhiều cách để hiện thực multithreading trong Java nhưng trong bài viết này, mình chỉ giới thiệu với các bạn về Callable và Future trong Java với khả năng trả về kết quả sau khi xử lý và có thể throw Exception nếu trong quá trình xử lý tác vụ có lỗi xảy ra.

OK, bắt đầu thôi các bạn…

Đầu tiên, mình sẽ tạo mới một project để làm ví dụ:

Multithreading với Callable và Future trong Java

Callable là một interface sử dụng Java Generic để định nghĩa đối tượng sẽ trả về sau khi xử lý xong tác vụ. Ở đây, mình sẽ lấy ví dụ về tính tổng của hai số, nhưng thay vì xử lý việc tính tổng này trong thread chính của chương trình, mình sẽ sử dụng Callable trong một thread khác để xử lý.

Đối tượng Callable của mình sẽ có nội dung như sau:

Để thực thi tác vụ của Callable, chúng ta phải submit nó vào một thread pool sử dụng phương thức submit() của Executor Framework.

Bây giờ, mình sẽ tạo main class cho ví dụ trên với nội dung như sau:

Với đoạn code ở trên, chúng ta chỉ dừng lại ở mức là submit Callable object vào thread pool để xử lý tác vụ. Làm thế nào để lấy kết quả sau khi xử lý xong? Nếu các bạn để ý, các bạn sẽ thấy đối tượng trả về của phương thức submit() là một đối tượng Future. Sử dụng đối tượng này, chúng ta có thể quản lý được status của Callable task và lấy được đối tượng trả về của Callable object.

Để lấy được kết quả trả về với đối tượng Future, chúng ta sẽ sử dụng phương thức get() của nó để đợi đến khi tác vụ của Callable hoàn thành và trả về kết quả.

Kết quả:

Multithreading với Callable và Future trong Java

Phương thức get() là synchronous, do đó nó sẽ blocking chương trình của chúng ta mỗi khi đợi kết quả của Callable. Để hạn chế rủi ro nó blocking chương trình quá lâu, chúng ta có thể sử dụng phương thức get() này với một thời gian timeout như sau:

Ngoài ra, chúng ta còn có thể sử dụng các phương thức isDone(), isCancelled() của đối tượng Future để tìm hiểu về status hiện tại của đối tượng Callable mà nó đang monitor.

5/5 - (3 bình chọn)

7 thoughts on “Multithreading với Callable và Future trong Java

  1. Bạn ơi chỉ giúp mình chút nhé, mình đang gặp một vấn đề thế này.
    Mình submit 10 tasks vào pool có 4 threads, mỗi tasks này truyền vào 1 file xml để parser và return về 1 object.
    Khi run thì object từ future đầu tiên cho kết quả OK, lần 2 thì bị null và bắn Exeption. Mình đang nghi
    ngờ là tasks 2 sau khi parser xong lại bị khởi tạo lại object. Không biết có phải như vậy không, nhờ bạn chỉ giúp mình nhé!!

    1. Mình hiểu vấn đề rồi, điều mình nghi ngờ không xảy ra hàm get của future block cho tới khi return kết quả. Vấn đề của mình nằm ở chỗ khác trong code của mình :))

Add Comment