Java 如果两个线程同时执行,为什么我们得不到count的更新值?
两个线程同时在给定程序中执行,但此代码每次都给出0输出。为什么不更新计数值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
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
变量。因此,每次执行的结果可能会有所不同。