Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

R_K

Jak przekazać do równolegle wykonywanych wątków zmienną z pętli for?

Polecane posty

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?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

trzymaj referencje do obiektów wątków i wtedy normalnie wywołujesz na danym obiekcie seter z przekazaną wartością.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

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ąć?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

heh, witaj w świecie wielowątkowych aplikacji :)

Tak to już z watkami jest, ustaw te wartosci przed wywolanie start.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

×
×
  • Utwórz nowe...