我正在使用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的结果是什么? - 每个线程的方法执行是同时发生还是一个接一个发生?
答案 0 :(得分:0)
JVM如何调用两种方法"并行"完全没有区别。
换句话说:如果你想知道调用方法时会发生什么,你可以查看here。
调用方法"两次"并行,然后整个事情......只发生两次!
当该方法在该类或其他对象中进行更新时,事情变得有趣! (比如更改对象的字段,或将值附加到列表,...)
你知道,多线程的真正复杂性是不关于并行运行一些代码。 真正的问题是"共享数据"所发生的事情。
如果你找到我的答案一般;对不起 - 这可能是你对这样一般性问题的最好期望。
答案 1 :(得分:0)
如果[] threadB调用callFoo(1)并且threadC同时调用callFoo(3),那么: - 哪个线程能够首先调用该方法?
线程彼此独立运行。如果没有同步(在您的示例中没有“),那么任何数量的线程都可以同时调用同一方法。
每当一个线程调用一个方法时,它就会创建一个激活记录来保存该方法的所有局部变量和参数,当多个线程同时调用同一个方法时,每个线程获得自己的激活记录。线程既不能通过args和locals彼此通信,也不能互相干扰args和locals的使用。
当然,他们可以通过任何共享对象进行通信和干扰,包括args或本地人可能引用的对象。