Wątek i pętle.

0

Witam,

Mam problem z wątkiem w javie.
Wątek ma za zadanie w nieskończoność sprawdzać zawartość tablicy ArrayList i na podstawie uzyskanych informacji podejmować pewne czynności.

public class SprawdzKlientow implements Runnable
{
   public void run()
   {
      System.out.println("Odpalił się wątek");

      while(true)
      {
         //System.out.println(KlienciArrayList.size());
         for (int y=0; y<KlienciArrayList.size();y++)
         {
            klient b = (klient) KlienciArrayList.get(y);
            long Ktime = b.getTime();
            long Atime = System.currentTimeMillis();  
            long LTime = Atime - Ktime;

            if (LTime > 10000)
            {
               KlienciArrayList.remove(y);
            }
         }
      }
   }
}

Problem w tym, że wątek się odpala bo pokazuje się napis "Odpalił się wątek" niestety nic poza tym. Gdy odkomentuję pierwszy wiersz w pętli while to pętla for ładnie się wykonuje. Why???

0

A co oczekujesz żęby się w tym programie wydarzyło? Inicjalizujesz tam kilka zmiennych i zdaje się, że nic z nimi nie robisz. Opisz dokładniej co byś chciał osiągnąć
Z tego co widze porównujesz czas z z obiektu z obecnym czasem i jeśli jest za duża różnica to usuwasz z tablicy, masz na myśli, że te elementy się nie usuwają?

Skoro pętla for się nie wykonuje to pewnie KlienciArrayList.size() zwraca 0. Cięzko stwierdzić nie widząc reszty kodu, ale sprawdz czy masz cokolwiek w tej tablicy.

0

Gdy dodam zaraz na początku petli while takie coś:

try
{
   Thread.sleep(500);
}
catch (InterruptedException exx)
{
   // exx.printStackTrace();
}

To wtedy działa ok.

0

Bez żadnej synchronizacji i tak nie będzie to działać w sensie ogólnym. Takie „sprzątanie” tablicy powinno być operacją atomową, w szczególności – blokować zapis i odczyt. Bo wyobraź sobie sytuację:

Wętek operacyjny Wątek sprzątający
Czytaj element 0 Zacznij sprzątanie
Modyfikuj pobrany element Usuń element 0
Zapisz zmodyfikowany element pod indeksem 0 ...

W tym momencie wszystko się sypie, zostaje nadpisany element 1 który teraz znalazł się na pozycji 0 (bo 0 jest usunięty przez sprzątacza), zapewne gdzieś rzuci się IndexOutOfBounds… Tragedia jednym słowem.

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