Wątki w vectorze

0

Witam wszystkich :)

Nie moge sie uporac z dosc prosta sprawa [glowa] otoz
chce wstawiac watki do wektora w celu ich wywolywania i wstrzymywania: notify() i wait()

tworze wektor
public static Vector<Thread> wektor= new Vector<Thread>(10);

wstrzymuje wybrany watek
Thread.currentThread().wait();
wektor.addElement(Thread.currentThread());

w innym miejscu go uruchamiam
wektor.elementAt(0).notify();
wektor.removeElementAt(0);

i widze blad
java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)

w tutorialu czytam zeby zrobic tak:
while (<condition does="does" not="not" hold="hold">)
obj.wait();

ale nie bardzo wiem jak to zaimplementowac, choc uzywam zmiennych condition

pomozecie :-(

0

Hm... pierwszy strzał jest taki, że Vector jest synchronizowany, ale to nie to.
Zresztą niekoniecznie jest to błąd. IllegalMonitorStateException jest rzucany jeżeli chcesz powiadomić inne wątki i umożliwić im wyjście z wait(). Możesz przechwytywać wyjątek, ale to nie najlepszy pomysł.
Sama idea przechowywania czegoś w wektorze nie jest tu najlepsza. W API javy masz lepsze narzędzie:
http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/Executor.html

Pozwala na wywoływanie różnych wątków i ich kolejkowanie.

0
Koziołek napisał(a)

Zresztą niekoniecznie jest to błąd. IllegalMonitorStateException jest rzucany jeżeli chcesz powiadomić inne wątki i umożliwić im wyjście z wait(). Możesz przechwytywać wyjątek, ale to nie najlepszy pomysł.

K*$@a Koziolek, ile razy widze Twoj post na temat watkow to tym bardziej jestem przekonany ze nie masz o tym zielonego pojecia. O ile na temat Executorow i innych z JSE 1.5 moze nawet cos wiesz, to na temat podstawowej synchronizacji (wait, notify, itp) lepiej juz nie pisz wiecej. I (duzo) poczytaj.

@zdesperowany:
Metody wait() i notify() nie uzywa sie najczesciej na obiektach typu Thread, a na specjalnych obiektach bedacymi tzw monitorami. (Thread tez moze byc monitorem, jak kazdy inny obiekt, ale nie uzywa sie tego tak). Zajrzyj do jakiegos tutoriala na temat watkow (Koziolek rowniez niech tam zajrzy): http://java.sun.com/docs/books/tutorial/essential/concurrency.
Uzywanie metod wait() i notify() (oraz odmian wait() i notifyAll()) dany watek musi miec locka na obiekcie na ktorym te metody sa wywolywane. Locka dostaje sie za pomoca bloku synchronized (monitor) {} lub metod synchronzied (to samo co blok, tylko obejmuje kod calej metody i monitorem jest obiekt this). Zdaje sobie sprawe ze nie mowi to nc autorowi, ale po zrobieniu tutka Suna dasz rade.

Pomysl z Executorami jest spoko, ale trzeba w miare rozumiec co sie robi.

Pozdro.

0

A ja polecam wszystkim jeszcze ten link:

http://tutorials.jenkov.com/java-concurrency/index.html

No i 30 minut codziennie Yogi dla relaksu :-D

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