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



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

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但这是一个完全不相关的变量。

您可能期望做的是递增一个共享的线程安全变量。 为此,我建议将count设置为AtomicInteger

static AtomicInteger count = new AtomicInteger(0);

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

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

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

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

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

最新更新