gpt4 book ai didi

java - 你能在不同的线程上调用相同的方法吗?

转载 作者:行者123 更新时间:2023-12-03 17:43:54 25 4
gpt4 key购买 nike

我知道真的是菜鸟问题,但我试图了解方法和线程如何作为业余程序员工作。我敢肯定这是我根本缺乏理解,但希望一些好人可以让我直截了当。

我想知道的是,如果您使用多个线程多次调用同一方法,您是否会创建每个方法的沙盒版本,它们彼此独立运行,或者它们是否会相互干扰。例如,我在下面敲了一些非常简单的代码来试图说明我的意思。

因此,在示例中,我们有一个在单击按钮时调用的方法。它需要两个数字并将它们提供给第二个方法,该方法将它们相加并返回结果。这似乎是直截了当的。但是想象一下,我们想使用相同的方法进行另一次计算,但我们不想等待第一次计算完成。我们可以调用在单独的线程上添加数字的方法,这样它就不会阻塞 UI 线程。凉爽的。好的,但是如果我们这样做两次呢?还是三倍?

我想问的是,当“doSum”第一次被调用时,传入它的数字是 10 和 20。代码在单独的线程上运行该方法,应该返回答案 30。第二次调用它数字是 30 和 50,结果应该是 80。如果由于某种原因第一个线程中的计算仍在继续,当我第二次调用相同的方法时它会被覆盖吗? result1 是否有被返回为 80 或 140 的危险?

这对任何人都有意义吗?

public void onbuttonclicked(View v) {

int number1;
int number2;
int result1, result2, result3;


//first callculation --------------------------------------
number1 = 10;
number2 = 20;
Thread t1 = new Thread(new Runnable() {
public void run() {
result1 = doSum(number1, number2);
}
});
t1.start();


//second callculation -----------------------------------
number1 = 30;
number2 = 50;
Thread t2 = new Thread(new Runnable() {
public void run() {
result2 = doSum(number1, number2);
}
});
t2.start();

//third callculation -----------------------------------------
number1 = 60;
number2 = 80;
Thread t3 = new Thread(new Runnable() {
public void run() {
result3 = doSum(number1, number2);
}
});
t3.start();


}


public static int doSum(int a, int b)
{
int result = a + b;
return result;
}

最佳答案

主要有两件事你应该知道。

  • 如果 2 个线程调用相同的方法,每个线程将有不同的堆栈帧用于该方法。因此,方法局部变量是线程安全的。对一种方法的局部变量所做的更改不会干扰其他线程的更改。
  • 当两个线程都修改共享资源时,您应该(通常)担心线程安全/干扰。

  • PS:您的 doSum()做很少的处理。智能 JVM 可能实际上内联该方法。

    关于java - 你能在不同的线程上调用相同的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26421701/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com