gpt4 book ai didi

java - 何时以及由谁执行方法调用?

转载 作者:行者123 更新时间:2023-12-01 23:04:34 24 4
gpt4 key购买 nike

我使用一个简单的方法调用来执行其他类中的方法。

当我将其与两个线程和一个 BlockingQueue 结合使用时,我问自己,哪个线程以及何时执行此调用。

我制作了一个伪代码示例,它并不是真正有用,但描述了情况:

线程A

public class ThreadA extends Thread {
private static final String TAG = "ThreadA";

@Override
public void run() {

ThreadB threadB = new ThreadB();
threadB.start();
InputStream InPut = null;//Imagen this inputStream results out of any kind
//of connection (Bluetooth,...)
byte[] buffer = new byte[1024];

while (true){
try {
InPut.read(buffer);
threadB.send(buffer+"");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

线程B

public class ThreadB extends Thread {
private static final String TAG = "ThreadB";

private BlockingQueue<String> queue = new LinkedBlockingQueue<>();

@Override
public void run() {
while (true){
String st ="";
try {
st = queue.take();
} catch (InterruptedException e) {
e.printStackTrace();
}

Log.d(TAG, "String is: " + st);
}
}


public void send(String a) {
queue.add(a);
}
}

Szenario:当线程 B 在 .take() 中被阻塞但该方法被调用时,这是如何工作的?

我的问题源于观察,当我使用它时,线程 A 中的输入流读取了错误的数据。

最佳答案

threadB.send(buffer+"");

我假设您对这次通话感到困惑。这是threadA调用的方法。

要总体理解这一点,您需要区分线程 Java 对象和实际操作系统线程。 Java线程对象并不是“真正的”线程,它们只是线程的代表。

如果在线程对象上调用 start(),它将创建一个新的“真实”操作系统线程,该线程运行 run() 方法。在此类线程对象上调用的其他方法(例如 join())是在当前线程上调用的方法,但会触发与“真实”线程交互的操作系统系统调用。您调用的 Thread 子类内部有一个方法与执行它的线程无关,它始终是当前线程。

关于java - 何时以及由谁执行方法调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58407697/

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