2017-04-17 36 views
1

两个线程同时在给定程序中执行,但此代码每次都给出0个输出。为什么不更新计数值?如果两个线程同时执行,为什么我们没有获得count的更新值?

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; 
     } 
    } 
} 
+2

您打印前是否尝试插入'Thread.sleep()'? – SilverNak

+0

如果我使用Thread.sleep(),那么它工作正常。但是,为什么在上面的代码中,count没有得到更新? –

回答

0

TLDR

t.join(); 

说明

当您启动ThreadB,线程可能不会立即开始。由调度程序决定哪个线程在哪个时间执行。此外,ThreadA不会等待ThreadB完成其执行。所以会发生什么(propably,作为调度程序能够在每次执行决定不同)是:

  • 的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); 
} 
+0

如果我们不使用join()会怎么样? –

+0

@DJoshi ThenThreadB将在ThreadA完成时终止。这可能在开始之前,执行时或完成之后(取决于调度程序的作用)。而且ThreadA可以随时访问ThreadB的'count'变量。所以结果可能会因执行而异。 – SilverNak

相关问题