gpt4 book ai didi

java - C++/Java 绑定(bind) : In which side should multi-threading be implemented?

转载 作者:太空狗 更新时间:2023-10-29 21:39:58 24 4
gpt4 key购买 nike

我正在我的库中实现一个名为 HttpDataStream 的 C++ 类。我必须执行 JNI 绑定(bind)才能在 Android 下使用我的库,并使用 iOS 的 Objective-C 绑定(bind)。

我需要在 Java 和 Objective-C 中创建一个专用的 HttpDataStream 类,但我想知道这些类是否真的会阻塞整个应用程序直到下载完成。

例如,让我们从“Android 端”的HttpDataStream 类中调用一个read 方法:

std::streamsize DataStreamJava::read(double value) {
jmethodID m = jni->GetMethodID(j_dataStream_class_,
"read", "(D)J");
jni->CallLongMethod(j_dataStream_global_, m);
return 0;
}

假设 read 方法将下载文件并返回下载的字节数。我目前在想,即使我在“Android 端”使用 Threads 和 Runnables,C++ 库实际上也会阻塞,直到下载完成。

所以我问自己以下问题:

  • 是否应该在 C++ 和 Java 端都实现多线程?
  • 我应该用 C++ 实现一个在下载完成后调用的 DataStreamObserver 吗?

最佳答案

答案取决于您对多线程的期望:

a) 一侧的流水线相关操作

如果您在 Java 端的 read() 执行多个依赖操作,例如读取、解释或预处理数据,并最终呈现它,您可以考虑在 Java 端进行多线程处理。

但是无论您在那一侧如何操作,您对流类的单个调用 read() 只会在 java 端的所有多线程操作完成时返回。所以是的,在这种情况下,C++ 代码被卡住了,等待返回。

b) 做一些不相关的事情

因此,如果您希望您的 C++ 代码在读取数据时执行其他操作,但与获取的数据无关,您应该考虑在 C++ 端执行多线程(不要忘记将 JNI 环境附加到新线程!)。

c) 双方流水线相关 Action

但是如果你需要在C++端处理一部分Java获取的数据(比如开始显示数据),那么你可以选择以下两种方式之一:

  • C++ 中的多线程,前提是您有办法同时访问正在 java 中读取的数据(例如,读取小块,或允许访问正在填充的缓冲区的 java 函数)
  • Java 中的多线程调用本地 C++ 函数作为每次部分数据准备就绪时的回调:在这种情况下,JNI 将负责在与 Java 线程相对应的不同线程中运行每个回调 C++ 函数。

Java 或 C++ 中的观察者

这取决于您的选择和与先前选择相关的约束。不了解更多,很难给你客观有用的建议。

关于java - C++/Java 绑定(bind) : In which side should multi-threading be implemented?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31746945/

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