W moim projekcie buduję framework wykonawczy Java, który odbiera żądania pracy od klienta. Praca (różna wielkość) jest podzielona na zestaw zadań, a następnie umieszczana w kolejce do przetwarzania. Istnieją osobne kolejki do przetwarzania każdego typu zadania, a każda kolejka jest powiązana z wątkiem. Zestawy ThreadPools są skonfigurowane w taki sposób, aby ogólna wydajność silnika była optymalna.Kradzież pracy/zadania ThreadPoolExecutor
Ten projekt pomaga nam efektywnie ładować żądania, a duże żądania nie kończą się na hakowaniu zasobów systemowych. Czasami jednak rozwiązanie staje się nieskuteczne, gdy niektóre z kolejek są puste, a ich pule wątków pozostają bezczynne.
Aby było to lepsze, zastanawiałem się nad wprowadzeniem techniki kradzieży pracy/zadania, tak aby mocno obciążona kolejka mogła uzyskać pomoc z innych pakietów ThreadPool. Może to jednak wymagać implementacji mojego Executora, ponieważ Java nie pozwala na powiązanie wielu kolejek z wątkiem ThreadPool i nie obsługuje koncepcji kradzieży pracy.
Przeczytaj o Fork/Join, ale to nie wydaje się pasować do moich potrzeb. Wszelkie sugestie lub alternatywny sposób na zbudowanie tego rozwiązania mogą być bardzo pomocne.
Dzięki Andy
Powinieneś pomyśleć o tym, jak utrzymać wszystkie procesory zajęte. Nie ma znaczenia, czy niektóre wątki są bezczynne, jeśli optymalnie wykorzystujesz procesory. –
Jeśli pule wątków mają tyle wątków, co cpus, każda pojedyncza pula wątków może "ukraść" wszystkie procesory, nawet jeśli wszystkie pozostałe pule wątków są bezczynne. –
@PeterLawrey - to prawda, ale w przypadku dużej ilości pul można mieć słabą wydajność, jeśli wszystkie wątki we wszystkich pulach działają w tym samym czasie. – jtahlborn