R_K Napisano Grudzień 20, 2011 Zgłoś Share Napisano Grudzień 20, 2011 Chcę napisać program w którym równolegle będzie wykonywane 5 wątków. Wątki będą uruchamiane w pętli for i chciałbym, żeby każdy z nich działać na zmiennej o wartości równej kolejnej wartości zmiennej i: for (int i= 0; i < 5; i++) { (new Thread( watki[i] )).start(); } Czyli np: (new Thread( watki[0] )).start() - w metodzie run() potrzebuje mieć zmienną o wartości 0, (new Thread( watki[1] )).start() - w metodzie run() potrzebuje mieć zmienną o wartości 1, (new Thread( watki[2] )).start() - w metodzie run() potrzebuje mieć zmienną o wartości 2, itd. A ściślej mówiąc potrzebuję tej wartości w metodach Increment() i DlugoTrwajacaFunkcja(), które są z tej metody run() wywoływane. Na razie ma taki kod: public class Uruchom { static Integer nr_watka = 0; static Integer ilosc_watkow = 5; public static void main(String[] args) { Watek[] watki = new Watek[ ilosc_watkow ]; for (int i = 0; i < watki.length; i++) { watki[i] = new Watek(); (new Thread( watki[i] )).start(); } } public static synchronized void Increment() { nr_watka++; System.out.print("#" + nr_watka + " "); } public static void DlugoTrwajacaFunkcja(){ System.out.println("(" + nr_watka + ")"); } } class Watek implements Runnable { public void run() { Uruchom.Increment(); Uruchom.DlugoTrwajacaFunkcja(); } } W DlugoTrwajacaFunkcja() będę wykonywał pewne operacje, które będą trwały - zakładam - kilka minut. Chodzi mi o to, żeby w tej funkcji zmienna nr_watka miała taką samą wartość jak w funkcji Increment(). Chciałbym więc, żeby program za każdym razem dawał takie rezultaty: #1 (1) #2 (2) #3 (3) #4 (4) #5 (5) #numer - to wartość zmiennej nr_watka w funkcji Increment() (numer) - to wartość zmiennej nr_watka w funkcji DlugoTrwajacaFunkcja() Chodzi mi o to, żeby obie wartości były równe - tak jak powyżej. Tymczasem program oprócz takiego rezultatu pokazuje również inne, np: #1 (2) #2 (2) #3 #4 (4) #5 (5) (4) #1 (2) #2 (3) #3 (3) #4 (4) #5 (5) #1 (2) #2 (2) #3 (3) #4 #5 (5) (5) #1 #2 (2) #3 (2) #4 (3) (4) #5 (5) Jak więc zrobić, żeby mięć taką samą wartość zmiennej nr_watka w obu funkcjach? Najprościej byłoby oznaczyć funkcję DlugoTrwajacaFunkcja() jako synchronized, ale wtedy wątki nie wykonywałyby tych funkcji równolegle, tylko po sobie, dobrze rozumiem? Czy w związku z tym należy tu użyć funkcji do koordynacji wątków, np. wait i notify? Link do komentarza Udostępnij na innych stronach More sharing options...
Toster Napisano Grudzień 20, 2011 Zgłoś Share Napisano Grudzień 20, 2011 trzymaj referencje do obiektów wątków i wtedy normalnie wywołujesz na danym obiekcie seter z przekazaną wartością. Always Dark<br /> Link do komentarza Udostępnij na innych stronach More sharing options...
R_K Napisano Grudzień 20, 2011 Autor Zgłoś Share Napisano Grudzień 20, 2011 Archon, chodzi o coś takiego? public class Uruchom { static Integer ilosc_watkow = 5; public static void main(String[] args) { Watek[] watki = new Watek[ ilosc_watkow ]; for (int i = 0; i < watki.length; i++) { watki[i] = new Watek(); watki[i].SetNrWatka(i); //watki[i].nr_watka = i; (new Thread( watki[i] )).start(); } } public static void DlugoTrwajacaFunkcja(int nr_watka){ System.out.println("(" + nr_watka + ")"); } } class Watek implements Runnable { public int nr_watka = -1; public void SetNrWatka(int nr_watka){ this.nr_watka = nr_watka; } public void run() { Uruchom.DlugoTrwajacaFunkcja(nr_watka); } } Tyle, że ten kod też daje różne rezultaty: (0)(3) (2) (1) (4) (0) (3) (2) (4) (1) (0) (4) (1) (2) (3) A ja chciałbym, żeby rezultat był zawsze ten sam (0)(1) (2) (3) (4) Czyli chciałbym, żeby wątki mimo, że wykonują się równolegle to przyjmują taką wartość zmiennej i z pętli loop, w jakiej zostały wywołane: (new Thread( watki[0] )).start() - w wątku potrzebuje mieć zmienną o wartości 0, (new Thread( watki[1] )).start() - w wątku potrzebuje mieć zmienną o wartości 1, (new Thread( watki[2] )).start() - w wątku potrzebuje mieć zmienną o wartości 2, itd. Jak więc taką stałą kolejność osiągnąć? Link do komentarza Udostępnij na innych stronach More sharing options...
Toster Napisano Grudzień 20, 2011 Zgłoś Share Napisano Grudzień 20, 2011 heh, witaj w świecie wielowątkowych aplikacji Tak to już z watkami jest, ustaw te wartosci przed wywolanie start. Always Dark<br /> Link do komentarza Udostępnij na innych stronach More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.