2015-04-26 15 views
5

Próbuję utworzyć wiele wątków za pomocą pętli for w java, aby współużytkować ten sam licznik zmiennych. Robię coś nie tak, ponieważ chcę, aby licznik zwiększał się dla każdego wątku.Tworzenie wielu wątków za pomocą pętli w java

Jest to wyjście z następującego kodu:

Counter: 1
Counter: 1
Licznik: 1

public static void main(String[] args) { 
    int numThreads = 3; 
    for (int i = 0; i < numThreads; i++) { 
     Create c = new Create(); 
     Thread thread = new Thread(c); 
     thread.start(); 
    } 
} 


public class Create implements Runnable { 
    int counter = 0; 

    public void run() { 
     counter++; 
     System.out.println("Counter: " + counter); 
    } 
} 

Odpowiedz

9

stwierdzenie counter jak static i volatile:

static volatile int counter = 0; 

i wszystkie 3 wątki zostaną udostępnione.

Zwróć uwagę, chociaż zmienność dba o widoczność (gdy jeden wątek ją aktualizuje - zmiana będzie widoczna przez inne wątki) nie zajmie się atomowością modyfikacji, ponieważ należy zsynchronizować część, która Ci zwiększyć go, albo jeszcze lepiej, użyj AtomicInteger

2

moje zalecenie (& zbierając zmienił alfasin użytkownika), należy rozważyć to utworzenie klasy realizacji:

import java.util.concurrent.atomic.AtomicInteger; 

public class Create implements Runnable { 
    static AtomicInteger classCounter = new AtomicInteger(); 
    AtomicInteger objCounter = new AtomicInteger(); 
    public void run() { 
     System.out.println("Class Counter: " + classCounter.incrementAndGet()); 
     System.out.println("Object Counter: " + objCounter.incrementAndGet()); 
    } 
} 
+0

i 'counter' liczą każdy wątek, który klasy metody '#run()'? – Tom

+0

Nie, obecnie zlicza metodę uruchomienia (wykonania) s obiektu 'Create', aby osiągnąć ten cel na poziomie klasy, należy ustawić' counter' static. (lub w swojej głównej metodzie: po prostu utwórz jedno "Utwórz" dla wszystkich wątków.) – xerx593

+2

Dobrze, że wiesz, więc jak edytować kod w celu dopasowania do wymagań OPs? – Tom

Powiązane problemy