如果两个线程同时执行,为什么我们没有得到count的更新值?

时间:2017-04-17 10:24:35

标签: java multithreading

两个线程同时在给定程序中执行,但此代码每次都给出0输出。为什么不更新计数值?

class ThreadA {        
    public static void main(String[] agrs) {
        ThreadB t = new ThreadB();
        t.start();  
        System.out.println(t.count);
    }
}

class ThreadB extends Thread {
    int count = 0;
    public void run() { 
        for(int i = 0; i < 10; i++) {
            count = count + i;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

TLDR

t.join();

解释

启动ThreadB时,线程可能无法立即启动。由调度程序决定,哪个线程在哪个时间执行。此外,ThreadA不会等待ThreadB完成其执行。所以会发生什么(可能,因为调度程序可以在每次执行中做出不同的决定):

  • ThreadA运行
  • 创建了ThreadB
  • ThreadA打印计数
  • (如果程序不会在此处终止:执行ThreadB)

你想要的是:

  • ThreadA运行
  • 创建了ThreadB
  • ThreadA等待直到ThreadB完成
  • ThreadB进行计算
  • ThreadB完成
  • ThreadA打印计数

您可以使用您想要等待的线程的join方法来实现:

public static void main(String[] agrs) {
    ThreadB t = new ThreadB();
    t.start();
    t.join(); // Wait for ThreadB  
    System.out.println(t.count);
}