2015-04-26 67 views
5

我正尝试在java中使用for循环创建多个线程,以便它们共享相同的变量计数器。我做错了什么,因为我想让计数器为每个线程增加。如何在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

声明counterstaticvolatile

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'会计算每一个线程类#run()'方法? – Tom

+0

不,目前它计算一个'Create'对象的运行方法(执行),为了在课堂上达到这个目的,你需要使'counter'变成静态的。 (或者在你的主要方法中:为所有线程创建一个'Create') – xerx593

+2

好你知道吗,那么如何编辑你的代码来匹配OP的要求呢? – Tom