我期望main方法中的println返回值45,但是它返回0。
Main class:
public class Main {
public static void main(String[] args) {
MyCounter counter = new MyCounter();
Thread thread1 = new Thread(new MyThread(counter));
thread1.start();
System.out.println(counter.getCount()); //Prints 0 :(
}
}
MyThread class:
class MyThread implements Runnable{
MyCounter counter;
public MyThread(MyCounter counter){
this.counter = counter;
}
@Override
public void run() {
for (int i = 0; i<10; i++){
counter.inc(i);
}
}
}
MyCounter:
class MyCounter {
private int count = 0;
public void inc(int i){
count += i;
}
public void dec(){
count--;
}
public int getCount(){
return count;
}
}
答案 0 :(得分:0)
可能有两种情况。
在主线程中调用System.out.println
时,thread1
尚未使计数器递增。
thread1
已增加了计数器的数量,但主线程由于内存障碍而没有注意到它。
您可以在呼叫System.out.println
之前添加thread1.join()
。
当一个线程终止并导致另一个线程中的Thread.join发生时 返回,则终止线程执行的所有语句都具有 与之前的所有语句之间的先发生后关系 成功加入。现在可以看到线程中代码的效果 到执行联接的线程。
可以确保:
System.out.println
将在计数器递增后执行。
主线程可以获取更新的计数器。
答案 1 :(得分:-1)
您的主线程在新线程执行任何操作之前结束。延迟执行一点时间。
MyCounter counter = new MyCounter();
Thread thread1 = new Thread(new MyThread(counter));
thread1.start();
Thread.sleep(1000);
System.out.println(counter.getCount()); //Prints 0 :(
这不是阐明多线程恕我直言的最佳示例。