多线程方法调用如何工作

时间:2016-09-25 14:34:48

标签: java multithreading

我正在使用java。

我有一个A类实例,它有一个运行公共方法foo()和另外两个线程 - threadB和threadC,它们都在同一时间运行。

这里的A级

public class A {
    int val = 0
    public void foo(int incValue) {
        a += incValue;
    }
    public static void main (String arg[]) {
        MyThread a = new MyThread(this);
        new Thread(a).start();
        MyThread b = new MyThread(this);
        new Thread(b).start();
    }
}

这里是threadB和threadC的线程定义:

public class MyThread implements Runnable {
    A main = null;
    public MyThread(A main) {
        this.main = main;
    }
    public callFoo(int incValue) {
        main.foo(incValue);
    }
    @Override
    public void run() {
        //valToInc can be a value from a GUI form.
        callFoo(valToInc);
    }
}

如果在threadB中调用callFoo(1)并且threadC同时调用callFoo(3),则:   - 哪个线程可以先调用该方法?   - 两次执行后主要类中val的结果是什么?   - 每个线程的方法执行是同时发生还是一个接一个发生?

2 个答案:

答案 0 :(得分:0)

JVM如何调用两种方法"并行"完全没有区别。

换句话说:如果你想知道调用方法时会发生什么,你可以查看here

调用方法"两次"并行,然后整个事情......只发生两次

当该方法在该类或其他对象中进行更新时,事情变得有趣! (比如更改对象的字段,或将值附加到列表,...)

你知道,多线程的真正复杂性是关于并行运行一些代码。 真正的问题是"共享数据"所发生的事情。

如果你找到我的答案一般;对不起 - 这可能是你对这样一般性问题的最好期望。

答案 1 :(得分:0)

  

如果[] threadB调用callFoo(1)并且threadC同时调用callFoo(3),那么: - 哪个线程能够首先调用该方法?

线程彼此独立运行。如果没有同步(在您的示例中没有“),那么任何数量的线程都可以同时调用同一方法。

每当一个线程调用一个方法时,它就会创建一个激活记录来保存该方法的所有局部变量和参数,当多个线程同时调用同一个方法时,每个线程获得自己的激活记录。线程既不能通过args和locals彼此通信,也不能互相干扰args和locals的使用。

当然,他们可以通过任何共享对象进行通信和干扰,包括args或本地人可能引用的对象。