Những lợi thế / lý do để sử dụng Handler và không phải là Thread là gì?
Trình xử lý cho phép bạn gửi và xử lý Tin nhắn và Runnable
các đối tượng được liên kết với một chuỗi MessageQueue
. Mỗi Handler
phiên bản được liên kết với một luồng và hàng đợi tin nhắn của luồng đó.
Khi bạn tạo một cái mới Handler
, nó bị ràng buộc với hàng đợi luồng / tin nhắn của luồng đang tạo nó - từ thời điểm đó, nó sẽ gửi tin nhắn và runnable đến hàng đợi tin nhắn đó và thực hiện chúng khi chúng ra khỏi hàng đợi tin nhắn .
Có hai cách sử dụng chính cho Handler:
- Để lên lịch tin nhắn và Runnables sẽ được thực thi như một số điểm trong tương lai
- Để enqueue một hành động được thực hiện trên một sợi khác với của riêng bạn.
Nếu bạn sử dụng các luồng java, bạn phải tự xử lý một số thứ - đồng bộ hóa với luồng chính, hủy bỏ một luồng, v.v.
Chủ đề duy nhất này không tạo ra một nhóm chủ đề trừ khi bạn sử dụng ThreadPoolExecutor
hoặcExecutorService
API.
(Lấy truy vấn này từ nhận xét của bạn về câu trả lời của Blackbelt)
Tại sao không sử dụng Executor? và ngay cả khi tôi đã muốn sử dụng Handler để làm điều đó, làm thế nào?
Tài liệu tham khảo : Bài viết hiệu suất chủ đề
Có một số loại công việc nhất định có thể được giảm xuống thành các nhiệm vụ phân tán, song song cao. Với khối lượng lớn các gói công việc, điều này tạo ra AsyncTask
và HandlerThread
không phải là các lớp thích hợp. Bản chất đơn luồng của AsyncTask
sẽ biến tất cả các công việc phân luồng thành một hệ thống tuyến tính. Sử dụngHandlerThread
Mặt khác, lớp sẽ yêu cầu lập trình viên quản lý thủ công cân bằng tải giữa một nhóm các luồng.
ThreadPoolExecutor là một lớp trợ giúp để làm cho quá trình này dễ dàng hơn. Lớp này quản lý việc tạo ra một nhóm các luồng, đặt mức độ ưu tiên của chúng và quản lý cách phân phối công việc giữa các luồng đó. Khi khối lượng công việc tăng hoặc giảm, lớp sẽ tăng hoặc phá hủy nhiều luồng hơn để điều chỉnh theo khối lượng công việc.
BlockingQueue workQueue= new LinkedBlockingQueue<Runnable>(100); // Work pool size
ThreadPoolExecutor executor = new ThreadPoolExecutor(
Runtime.getRuntime().availableProcessors(), // Initial pool size
Runtime.getRuntime().availableProcessors(), // Max pool size
1, // KEEP_ALIVE_TIME
TimeUnit.SECONDS, // KEEP_ALIVE_TIME_UNIT
workQueue);
Bạn có thể tham khảo bài viết hướng dẫn dành cho nhà phát triển này trên creat-threadpool để biết thêm chi tiết.
Hãy xem bài đăng này để sử dụng Handler
để chạy nhiều phiên bản Runnable. Trong trường hợp này, tất cả các Runnable
tác vụ sẽ chạy trong một Chủ đề duy nhất.
Android: Toast trong một chủ đề