Załóżmy, że mam zadanie, które pobiera elementy z java.util.concurrent.BlockingQueue i przetwarza je.ScheduledEexecutorService ze zmiennym opóźnieniem
public void scheduleTask(int delay, TimeUnit timeUnit)
{
scheduledExecutorService.scheduleWithFixedDelay(new Task(queue), 0, delay, timeUnit);
}
Jak mogę zaplanować/zmienić harmonogram zadania, jeśli częstotliwość może być zmieniana dynamicznie?
- Chodzi o to, aby wziąć strumień aktualizacji danych i propagować je w partii do GUI
- Użytkownik powinien być w stanie zmieniać częstotliwość aktualizacji
Nie jest dla mnie jasne, dlaczego używasz kolejki blokującej. jeśli kolejka youe jest pusta. Zakładam, że zaplanowane zadanie zostanie zablokowane. czy to twoja intencja? Prawdopodobnie spowoduje to zamieszanie w harmonogramie zadań. –
Wybrałem implementację ArrayBlockingQueue, ponieważ musi ona być bezpieczna dla wątków, przestrzegać kolejności FIFO i być ograniczona. Nawet jeśli zadanie blokuje, to nie powinno mylić planowania zadań, czy nie? – parkr
Używasz poprawnej implementacji BlockingQueue (w rzeczywistości ScheduledThreadPoolExecutor używa jej wewnętrznie). Dlaczego jednak rozpowszechniasz swoje aktualizacje GUI, używając w ogóle timera? Dlaczego nie zrobić tego w czasie rzeczywistym? Czy jest zbyt wiele aktualizacji? Czy martwisz się obracaniem nici Swing? – Adamski