Executors
zapewnia newCachedThreadPool()
i newScheduledThreadPool()
, ale nie newCachedScheduledThreadPool()
, co daje tutaj? Mam aplikację, która otrzymuje wiadomości masowe i musi zaplanować dość długi etap przetwarzania po ustalonym opóźnieniu dla każdego. Ograniczenia czasowe nie są super ścisłe, ale wolałbym, aby więcej wątków zostało utworzonych w locie, jeśli przekroczę rozmiar puli, a następnie będę je przycinał podczas okresów braku aktywności. Czy jest coś, co przegapiłem w równoległej bibliotece, czy muszę napisać własną?Dlaczego nie ma zaplanowanej buforowanej puli wątków dostarczanej przez klasę Java Executors?
Odpowiedz
java.util.concurrent.Executors
to nic więcej niż zbiór statycznych metod wygody, które budują wspólne aranżacje wykonawców.
Jeśli potrzebujesz czegoś konkretnego, co nie jest oferowane przez Executors
, możesz swobodnie zbudować własną instancję klas implementacji, korzystając z przykładów w Executors
jako przewodnika.
Jak mówi skaffman, Executors
to tylko zbiór metod fabrycznych. jeśli potrzebujesz konkretnej instancji, zawsze możesz sprawdzić wszystkie istniejące implementatory Executor
. W twoim przypadku myślę, że dzwonienie do jednego z różnych konstruktorów ScheduledThreadPoolExecutor byłoby dobrym pomysłem.
Mimo to ScheduledThreadPoolExecutor ma ustawiony stały rozmiar. – nos
Zgodnie z projektem element ScheduledThreadPoolExecutor ma ustalony rozmiar. Można użyć wersji z pojedynczym wątkiem, która przesyła do zwykłej usługi ExecutorService w celu wykonania zadania. Ten wątek zdarzenia + puli pracowników jest dość łatwy do koordynowania, a elastyczność nadrabia dedykowany wątek. Używałem tego w przeszłości, aby zastąpić TimerTasks i inne niekrytyczne zadania, aby wykorzystać typowy executor jako ogólnosystemową pulę.
Sugerowana tutaj Why does ScheduledThreadPoolExecutor only accept a fixed number of threads? Obejście:
scheduledExecutor = new ScheduledThreadPoolExecutor(128); //no more than 128 threads
scheduledExecutor.setKeepAliveTime(10, TimeUnit.SECONDS);
scheduledExecutor.allowCoreThreadTimeOut(true);
** Uwaga przy użyciu tego rozwiązania **: rozważ to w [dokumentacji programu ScheduledThreadPoolExecutor] (http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ScheduledThreadPoolExecutor.html): _ "Ponadto prawie nigdy nie jest dobrym pomysłem ustawienie wartości corePoolSize na zero lub użycie ** allowCoreThreadTimeOut **, ponieważ może to opuścić pulę bez wątków do obsługi zadań, gdy tylko zaczną one działać." _ – rmoestl
nie można uzyskać 'ScheduledThreadPoolExecutor' do wyświetlania tego zachowania. Przy domyślnej implementacji, jeśli pula wątków jest pusta, metoda 'ensurePrestart()', metoda prywatna wywoływana przez wszystkie metody planowania, utworzy pracownika do obsługi nowego zadania. Istota github: https://gist.github.com/Groostav/600edf739a39cbbb33cbd64ad385d621 – Groostav
przeczytaj: oznacza to, że komentarz @rmoestl jest błędny, a strategia GKislina jest prawidłowa. Nadal oczywiście bardzo niepokoi fakt, że dokumenty sugerują, że nie jest to prawidłowa strategia i jest całkowicie możliwe, że czegoś brakuje. – Groostav
- 1. InheritableThreadLocal i puli wątków
- 2. Wyjątki dotyczące wątków puli wątków
- 3. Optymalny sposób tworzenia puli wątków o stałym rozmiarze w Javie przy użyciu usługi Executors
- 4. Java Executors: jak mogę zatrzymać przesłane zadania?
- 5. Przykład dynamicznej puli wątków w boost :: asio
- 6. Puli wątków "Naprawiono"/"Równoważenie obciążenia" C#?
- 7. Jak zwiększyć liczbę wątków w puli wątków tomcat?
- 8. Przesyłanie zadań do puli wątków daje RejectedExecutionException
- 9. Dlaczego klasa LinearLayout instance.getLayoutParams ma nieprawidłową klasę?
- 10. C# niższy priorytet wątku w puli wątków
- 11. Zmień rozmiar puli wątków na Jetty 9
- 12. Jak wybrać rozmiar puli wątków na Androida
- 13. Kolekcje Java. Dlaczego nie ma typów pierwotnych?
- 14. dlaczego LinkedList nie ma initialCapacity w java?
- 15. python - jak uzyskać liczbę aktywnych wątków uruchomionych przez określoną klasę?
- 16. Dlaczego Ruby nie ma wbudowanego ThreadPool?
- 17. Zastosowanie puli wątków w implementacji usługi .NET REST
- 18. Dlaczego warto korzystać z puli autoreas?
- 19. Dlaczego rozmiar puli domyślnego wątku tomcat jest tak duży?
- 20. Dlaczego ta prosta aplikacja konsolowa .NET ma tak wiele wątków?
- 21. Dlaczego nie ma IntStream.flatMapToObj()?
- 22. Dlaczego nie ma jednolitej_dystrybucji?
- 23. Java: Konwertuj prymitywną klasę
- 24. Dlaczego SLComposeViewController nie ma delegata?
- 25. Blokowanie wątków Java
- 26. Ustawianie priorytetu wątków Java
- 27. Dlaczego nie ma połączenia UDP przez przeglądarkę nawet z HTML5?
- 28. Dlaczego nie ma std :: inplace_merge_unique?
- 29. Java StringBuilder i Bezpieczeństwo wątków
- 30. Dlaczego JDK ma zarówno Math.random(), jak i klasę Random?
IMHO ta odpowiedź jest mylące dla przedstawionego problemu, ponieważ sugeruje, że można po prostu skonstruować Executor że spełnia te szczególne wymagania. Ale czytanie dokumentacji [ScheduledThreadPoolExecutor] (http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ScheduledThreadPoolExecutor.html) wskazuje, że wywołanie kilku metod strojenia odziedziczonych po [ThreadPoolExecutor] (http : //docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html) "nie przynoszą żadnego użytecznego efektu" i dlatego pożądane zachowanie wydaje się nieobsługiwane przez 'ScheduledThreadPoolExecutor'. – rmoestl