Mục lục
Thread trong java?
Thread(luồng) là một phần thực thi độc lập bên trong một chương trình. Tất cả các chương trình java đều có ít nhất 1 thread là main thread được khởi tạo vởi JVM lúc khởi chạy chương trình, hàm main() sẽ được gọi bởi main thread.
Multithreading trong java
Hiểu đơn giản multithreading (đa luồng) là chúng ta có nhiều hơn 1 thread (main thread) thực thi bên trong chương trình. Hãy tưởng tượng 1 thread giống như 1 CPU riêng biệt trong máy tính, các CPU này sẽ thực hiện các nhiệm vụ được giao cùng lúc làm tăng tốc độ xử lý cho chương trình.
Trong thực tế, một CPU máy tính sẽ chia sẽ thời gian thực thi giữa các thread, luân chuyển qua lại giữa các thread của chương trình trong một khoảng thời gian nhất định. Nếu máy tính có nhiều CPU thì các thread trong chương trình có thể thực thi trên nhiều CPU khác nhau. Với CPU chỉ được giao 1 thread thì nó chỉ thực thi thread này, nếu được giao nhiều hơn 1 thread thì chúng tiến hành phân bổ thời gian chạy giữa các thread trong một khoảng thời gian nhất định trước khi chuyển sang thực thi thread khác.
Lợi ích khi sử dụng multithreading
Sử dụng multithreading trong một ứng dụng sẽ cho chúng ta một số lợi ích:
- Tận dụng tài nguyên tốt hơn trên một CPU.
- Tận dụng tài nguyên tốt hơn trên nhiều CPU.
- Tăng trải nghiệm người dùng.
Sử dụng multithreading tối ưu trên một CPU
Nếu chúng ta chỉ sử dụng duy nhất 1 thread, thread này gửi request cho server và chờ đến khi server response mới thực hiện tiếp! Lúc này CPU chẳng phải làm gì. Thật là phí phạm tài nguyên phải không? Nếu chúng ta có thêm 1 thread khác thì thread này sẽ thực hiện các công việc khác như render giao diện etc trong khi thread kia chờ response từ server, như vậy chúng ta sẽ sử dụng tối đa CPU từ multithreading hơn phải không!
Sử dụng multithreading tối ưu trên nhiều CPU
Nếu máy tính chúng ta có nhiều CPU thì lúc này các thread sẽ được phân bổ trên các CPU này, mỗi CPU có một hoặc nhiều thread khởi chạy, trên các CPU có nhiều thread sẽ tận dụng tối đa tài nguyên của CPU đó được giải thích cụ thể ở phần trên. Như vậy multithreading kết hợp với multicore thì còn gì bằng nào!
Sử dụng multithreading tăng trải nghiệm người dùng
Như đã nói ở trên thì multithreading giúp chúng ta tận dụng tối đa sức mạnh của máy tính từ đó tăng tốc độ xử lý của chương trình, có người dùng nào mà không thích một ứng dụng phản hồi nhanh phải không!
Nếu máy tính của bạn chỉ có 1 thread, và thread này đang thực thi gửi một request lên server và đợi response trả về, trong trường hợp này chương trình gần như đơ mặc cho người dùng người trước màn hình chờ cho đến khi server phản hồi và chương trình tiếp tục chạy. Nếu có thêm thread khác chạy chỉ để render giao diện và hiển thị vòng tròn xoay xoay loadding thì user sẽ đỡ ức chế hơn đấy.
Phân biệt giữa Multithreading và Multitasking
Multitasking
Một máy tính có thể thực thi cùng một lúc nhiều chương trình khác nhau được gọi là Multitasking. Hệ thống sẽ điều khiển mỗi CPU luân phiên thực thi mỗi chương trình trong một khoảng thời sau đó chuyển sang thực thi các chương trình khác. Chúng ta không còn giả định được chương trình của mình chiếm toàn bộ thời gian CPU mà nó chỉ chiếm một khoảng được hệ thống cấp cho.
Multithreading
Multithreading nghĩa là có nhiều thread thực thi cùng lúc trong một chương trình nhầm tối ưu tài nguyên của CPU, tăng tốc độ xử lý và trải nghiệm người dùng.
Các vấn đề trong multithreading
Multithreading là trong những cách tốt để tối ưu performance cho ứng dụng. Tuy nhiên tồn tại rất nhiều vấn đề trong mulithreading mà các lập trình viên phải đối mặt. Các thread thực thi trong cùng một chương trình nghĩa là chíng ta đọc ghi cùng một vùng nhớ.
Nếu một thread đang đọc dữ liệu từ vùng nhớ A trong lúc đó cũng có một thread khác ghi dữ liệu xuống A. Vậy đâu là giá trị cần đọc của thread đầu tiên? và làm sao để thống nhất một giá trị được sử dụng bởi 2 hay nhiều thread khác nhau? Đây là các vấn đề mà các lập trình viên java phải biết và tìm ra các phương pháp xử lý các lỗi liên quan xảy ra.
Nguồn tham khảo
http://tutorials.jenkov.com/java-concurrency/index.html#what-is-multithreading