Lista Timerów?

Lista Timerów?
CY
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 5 lat
  • Postów:22
0

Hejo, czy istnieje możliwość utworzenia listy z Timerami? Na ten moment mam coś takiego:

Kopiuj
public class TestTestTest extends CosTam {
private List<Timer> timers = new ArrayList<>();

public void onClientJoin(JoinEvent e) {
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                wykonajJakasFunkcje();
            }
        }, 0, 60000);

        timers.add(idKlienta, timer);  // idKlienta nie zaczyna się od zera, tylko jest jakąś tam większą liczbą.
}

public void onClientLeave(LeaveEvent e) {
       try {
            timers.get(e.getClientId()).cancel();
        } catch (Exception ex) {}
}
}

Lecz jak łatwo jest się domyślić, otrzymuję wyjątek, że nie można dodać timera do listy pod tym indeksem.
ID Klienta także zwykle nie jest kolejną liczbą (1,2,3,4...), a jest pomiędzy nimi przerwa (4,7,35,105...).

Przy dołączeniu klienta, zostaje utworzony timer wykonujący określoną funkcję co 60 sekund, a przy jego odłączeniu - ma on się anulować.

Istnieje jakiś inny sposób na to? ;p

S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
1

Uzyj mapy, ale najpierw może poucz się podstaw Javy...


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
Delor
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 2 lata
1

Tu lepiej powinna się sprawdzić java.util.Map.

damianem
  • Rejestracja:prawie 8 lat
  • Ostatnio:4 miesiące
  • Postów:205
2
  • tak jak wspomniano wcześniej, potrzebujesz mapy
  • zamiast tworzyć nowy timer za każdym razem jak dołącza nowy klient (pod spodem jest tworzony nowy wątek dla każdego timera - spory overhead) lepiej mieć gdzieś z boku ScheduledExecutorService
  • scheduling taska zwraca ScheduledFuture i ten obiekt przypisujesz do ID klienta - Map<Integer, ScheduledFuture>
  • możliwe że powinieneś tutaj użyć ConcurrentHashMap, jeśli metody onClientJoin i onClientLeave mogą być wykonywane z różnych wątków (jeśli pod spodem masz np. websockety)
CY
Takiej odpowiedzi potrzebowałem, bardzo dziękuję ♥ :D Metody są wykonywane przez jeden wątek, myślę, że jest to dosyć prosta aplikacja, żadnych websocketów itd. :D

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.