Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 何时以及谁执行方法调用?_Java_Android_Multithreading_Overriding - Fatal编程技术网

Java 何时以及谁执行方法调用?

Java 何时以及谁执行方法调用?,java,android,multithreading,overriding,Java,Android,Multithreading,Overriding,我使用一个简单的方法调用来执行其他类中的方法 当我将它与两个线程和一个BlockingQueue结合使用时,我问自己,哪个线程以及何时执行这些调用 我制作了一个伪代码示例,该示例并不真正有用,但描述了以下情况: 穿过 公共类ThreadA扩展线程{ 私有静态最终字符串标记=“ThreadA”; @凌驾 公开募捐{ ThreadB ThreadB=新ThreadB(); threadB.start(); InputStream InPut=null;//Imagen此InputStream产生任何

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

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

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

穿过
公共类ThreadA扩展线程{
私有静态最终字符串标记=“ThreadA”;
@凌驾
公开募捐{
ThreadB ThreadB=新ThreadB();
threadB.start();
InputStream InPut=null;//Imagen此InputStream产生任何类型的结果
//连接方式(蓝牙,…)
字节[]缓冲区=新字节[1024];
while(true){
试一试{
输入读取(缓冲区);
threadB.send(缓冲区+“”);
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
}
线程B
public类ThreadB扩展线程{
私有静态最终字符串标记=“ThreadB”;
private BlockingQueue=新建LinkedBlockingQueue();
@凌驾
公开募捐{
while(true){
字符串st=“”;
试一试{
st=queue.take();
}捕捉(中断异常e){
e、 printStackTrace();
}
Log.d(标签,“字符串为:”+st);
}
}
公共无效发送(字符串a){
加入(a);
}
}
Szenario:当线程B在
.take()
中被阻塞,但方法被调用时,这是如何工作的

我的问题来自观察,线程A中的inputstream在我使用它时读取了错误的数据

threadB.send(buffer+"");
我想你的困惑是关于这个电话。这是threadA调用的方法

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


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

您对“错误数据”的定义是什么?take()将阻止等待队列发出信号。您可以看看它在实际代码中是如何工作的。它可以在线使用,也可以在本地JDK文件中使用。@Flidor接收到的数据应该是大约1-10字节,并带有一些信息。使用方法调用时实际接收的数据最多为20个字节。第一个视图字节包含正确的数据,但其余字节只是错误的无用数据。您似乎没有重置缓冲区。应该给您一个int,它是实际读取字节的计数。然后,您应该只传递缓冲区的那部分(0到count-1)。@Flidor我在说这个。当我使用方法调用时,
.read
在实际代码中返回我20,我按照你说的做,就像使用读取字节数只传递实际读取的数据,但是当它返回20时,它将传递20。我将开始调试,稍后返回更多数据和结果。我可能会提出一个新问题,因为现在已经回答了执行代码的问题。暂时谢谢。好的,但是什么时候我们会在线程(在线程B的
run()
中)和线程a的内部使用像
send()
这样的公共方法呢,它是否与线程A上执行的?
send
相同。但是队列将发出信号并唤醒线程B,以继续执行线程B的
run
。当线程B通过
take()
被阻止,线程A执行
send()
时,线程A是否必须等待,因为只有在B未被阻止的情况下才能调用操作系统?或者这像是完全独立的吗?顺便说一句:如果在创建过程中给线程一个唯一的名称,并在方法中输出当前线程的name属性。@HydroHeiperGen,那么所有阻塞集合都将无效。如果线程B是否正在等待,线程A可以执行queue.Add(通过ThreadB.send)。没关系。这就是阻止集合的全部意义。