Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果两个线程同时执行,为什么我们得不到count的更新值?_Java_Multithreading - Fatal编程技术网

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

Java 如果两个线程同时执行,为什么我们得不到count的更新值?,java,multithreading,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 co

两个线程同时在给定程序中执行,但此代码每次都给出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;
        }
    }
}
类线程a{
公共静态void main(字符串[]agrs){
ThreadB t=新ThreadB();
t、 start();
系统输出打印项次(t计数);
}
}
类ThreadB扩展线程{
整数计数=0;
public void run(){
对于(int i=0;i<10;i++){
计数=计数+i;
}
}
}
TLDR:

说明:

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

  • ThreadA运行
  • ThreadB已创建
  • ThreadA打印计数
  • (如果程序不会在此终止:ThreadB被执行)
你想要的是:

  • ThreadA运行
  • ThreadB已创建
  • ThreadA等待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);
}
TLDR:

说明:

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

  • ThreadA运行
  • ThreadB已创建
  • ThreadA打印计数
  • (如果程序不会在此终止:ThreadB被执行)
你想要的是:

  • ThreadA运行
  • ThreadB已创建
  • ThreadA等待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);
}

打印前是否尝试插入
Thread.sleep()
?如果使用Thread.sleep(),则它工作正常。但是,为什么在上面的代码中,计数没有得到更新?在打印之前是否尝试插入
Thread.sleep()
?如果我使用Thread.sleep(),那么它工作正常。但是,为什么在上面的代码中,count没有得到更新?如果我们不使用join(),怎么办?@DJoshi那么threadb将在ThreadA完成时终止。这可能是在启动之前、执行期间或完成之后(取决于调度程序的操作)。ThreadA可以随时访问ThreadB的
count
变量。因此,执行的结果可能会有所不同。如果不使用join(),该怎么办?@DJoshi threadb将在ThreadA完成时终止。这可能是在启动之前、执行期间或完成之后(取决于调度程序的操作)。ThreadA可以随时访问ThreadB的
count
变量。因此,每次执行的结果可能会有所不同。