Java:线程不会增加我传递的类实例的实例变量的值

时间:2018-09-29 13:12:54

标签: java multithreading

我期望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;
    }
}

2 个答案:

答案 0 :(得分:0)

可能有两种情况。

  1. 在主线程中调用System.out.println时,thread1尚未使计数器递增。

  2. thread1已增加了计数器的数量,但主线程由于内存障碍而没有注意到它。

您可以在呼叫System.out.println之前添加thread1.join()

  

当一个线程终止并导致另一个线程中的Thread.join发生时   返回,则终止线程执行的所有语句都具有   与之前的所有语句之间的先发生后关系   成功加入。现在可以看到线程中代码的效果   到执行联接的线程。

可以确保:

  1. System.out.println将在计数器递增后执行。

  2. 主线程可以获取更新的计数器。

答案 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 :(

这不是阐明多线程恕我直言的最佳示例。