2015-04-26 2 views
5

Я пытаюсь создать несколько потоков, используя цикл for в java, чтобы они использовали один и тот же счетчик переменных. Я делаю что-то неправильно, потому что я хочу, чтобы счетчик увеличивался для каждого потока.Как создать несколько потоков с использованием цикла в java

Это выход для следующего кода:

Счетчик: 1
Счетчик: 1
счетчик: 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); 
    } 
} 

ответ

9

Объявляет counter, как static и volatile:

static volatile int counter = 0; 

и все 3 темы поделится им.

Обратите внимание, хотя волатильность заботится о видимости (когда один поток обновляет его - изменение будет видно другим потокам), он не заботится об атомарности модификации, для этого вы должны либо синхронизировать часть, которая вы увеличиваете его, или еще лучше, использовать AtomicInteger

2

Моей рекомендацию (& подбирая редактировать alfasin в), пожалуйста, рассмотрите эту Создать реализацию класса:

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

И это 'counter' будет считать каждый поток, class метод '#run()'? – Tom

+0

Нет, в настоящее время он подсчитывает метод запуска (выполнения) одного объекта «Создать», для достижения этого на уровне класса вам необходимо сделать «counter' static». (или в вашем основном методе: просто создайте «Создать» для всех потоков.) – xerx593

+2

Хорошо, что вы это знаете, так как насчет редактирования кода в соответствии с требованиями OP? – Tom

Смежные вопросы