Lista Timerów?

0

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

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

1

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

1

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

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)

1 użytkowników online, w tym zalogowanych: 0, gości: 1