两个线程在给定程序中同时执行,但是此代码每次给出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;
        }
    }
}

最佳答案

TLDR:

t.join();


说明:

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


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


您想要的是:


ThreadA运行
创建线程B
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);
}

09-27 00:25