线程运行时没有实现计数器值

时间:2015-04-20 18:15:18

标签: java multithreading count

我创建了以下程序,该程序使用相同的线程实例运行两个线程。我已经初始化了一个计数器,当每个线程运行时,应该实现计数器值,最后它应该在控制台中输出。

public class MTThread {

static int count = 0;

public static void main(String arg[]){

    System.out.println("Main started");
    MTThreadInner in1= new MTThreadInner(1,count);
    MTThreadInner in2= new MTThreadInner(2,count);

    in1.start();

    in2.start();
    while (true) {
        try {
             in1.join();
            in2.join();
            break;
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    System.out.println("Main finished, count = :"+ count);

}}

 class MTThreadInner extends Thread {
         int num; int counter;
         MTThreadInner(int i,int z) {
            counter=z;
            num = i;

         }

        public void run(){
                // TODO Auto-generated constructor stub
            yield();
            System.out.println("This ran Thread "+ num);
            counter=counter+1;

         }


    }

但输出始终显示为" 0":

主要开始

这运行了Thread 1

这运行了线程2

主要完成,计数=:0

2 个答案:

答案 0 :(得分:2)

输出应为count = 0,因为您不会在任何地方更改此变量。

您要做的是将此变量复制到MTThreadInner.counter中的另一个字段,其中每个帖子将其自身的副本更改为1,但这是一个完全不相关的变量。

您可能希望做的是增加共享的线程安全变量。为此,我建议计算一个AtomicInteger

static AtomicInteger count = new AtomicInteger(0);

通过这种方式,您可以将引用复制到同一个共享的线程安全对象中,当您在每个线程中调用counter.incrementAndGet()时,它将增加此对象。

答案 1 :(得分:1)

  

我创建了以下程序,该程序使用相同的线程实例运行两个线程。

不,您已创建了一个程序,该程序通过同一Thread子类的不同实例运行两个线程。

  

应该实现计数器值,并且在最后它应该在控制台中输出。

您的Thread子类的每个实例都有一个私有counter变量,我确信这些线程会更新(但您怎么知道?)。这与静态变量MTThread.count无关,这是您最后打印的内容。