线程 运行 时未实现计数器值

counter value is not being implemented when threads run

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

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”:

主要开始

这个运行线程1

这个运行线程2

主要完成,计数 = :0

输出应该是 count = 0,因为您没有在任何地方更改此变量。

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

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

static AtomicInteger count = new AtomicInteger(0);

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

I have created the following program which runs two threads with the same thread instance.

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

The counter value should be implemented and at the at end it should output in console.

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