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

0

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?

2
class Watek extends Thread{

  private final int numerWatku;

   public Watek(int numerWatku) {
       this.numerWatku = numerWatku;
  }

    public void run() {
        Uruchom.DlugoTrwajacaFunkcja(numerWatku);
    }
}
for (int i= 0; i < 5; i++) {
        new Watek(i).start();
}

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