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:
Java:
#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?