Trong dự án của tôi, tôi đang xây dựng một khung thực thi Java nhận các yêu cầu công việc từ một máy khách. Công việc (kích thước khác nhau) được chia nhỏ thành một tập hợp các tác vụ và sau đó được xếp hàng để xử lý. Có hàng đợi riêng biệt để xử lý từng loại tác vụ và mỗi hàng đợi được liên kết với một ThreadPool. ThreadPools được cấu hình theo cách sao cho hiệu suất tổng thể của động cơ là tối ưu.Work/Task Stealing ThreadPoolExecutor
Thiết kế này giúp chúng tôi cân bằng tải các yêu cầu có hiệu quả và yêu cầu lớn không kết thúc việc hogging tài nguyên hệ thống. Tuy nhiên đôi khi giải pháp trở nên không hiệu quả khi một số hàng đợi trống và hồ bơi chủ đề tương ứng của họ đang ngồi nhàn rỗi.
Để làm điều này tốt hơn, tôi đã nghĩ đến việc triển khai kỹ thuật đánh cắp công việc/nhiệm vụ để hàng đợi được tải nặng có thể nhận được sự trợ giúp từ các ThreadPool khác. Tuy nhiên điều này có thể yêu cầu thực hiện của riêng tôi Executor như Java không cho phép nhiều hàng đợi được liên kết với một ThreadPool và không hỗ trợ khái niệm ăn cắp công việc.
Đọc về Fork/Join nhưng điều đó dường như không phù hợp với nhu cầu của tôi. Bất kỳ đề xuất hoặc cách khác để xây dựng giải pháp này có thể rất hữu ích.
Cảm ơn Andy
Bạn nên suy nghĩ về cách giữ cho tất cả các CPU bận rộn. Nó không quan trọng nếu một số chủ đề của bạn là nhàn rỗi nếu bạn đang sử dụng tốt nhất của CPU của bạn. –
Nếu hồ bơi thread của bạn có nhiều chủ đề như bạn có cpus, bất kỳ hồ bơi thread cá nhân có thể "ăn cắp" tất cả các cpus ngay cả khi tất cả các hồ bơi thread khác đang nhàn rỗi. –
@PeterLawrey - đó là sự thật, nhưng nếu có rất nhiều hồ bơi, sau đó bạn có thể có hiệu suất kém nếu tất cả các chủ đề trong tất cả các hồ đang làm việc cùng một lúc. – jtahlborn