【发布时间】:2014-12-04 07:33:46
【问题描述】:
问题:
我需要将指示\对象从线程 A 传递给线程 B,并且该指示需要在线程 A 上异步处理(不阻塞)。
背景:
我设计了一个SDK(线程B),它基本上通过ThreadPoolExecutor机制运行一些任务。 第 3 方应用(线程 A),使用 SDK 请求运行任务和实现。结果的回调,任务可以并行操作并异步返回结果。
即一个请求sn-p:
SDK.taskA(new CustomCallback() {
@Override
public void onFinish(String s) {
// run some code - let's refer to as **Section A**
}
});
即 SDK 返回一个回调:
mCustomCallback.onFinish(String s);
问题在于回调 - “onFinish”是在工作线程 - SDK(显然)而不是在调用者线程上处理的。即如果调用者线程 (A) id 为 400,工作者 (B) 为 500,我需要在线程 400 上调用“onFinish”。
我尝试了不同的解决方案,但没有一个符合我的要求:
Handlers - 处理程序似乎是显而易见的解决方案,但必须管理和观察 Looper.prepare 每个线程只会被调用一次是很棘手的,如果第 3 方应用程序已经为调用线程定义了一个处理程序怎么办?他的应用程序是为了他自己的目的吗?或者如果他从单个线程启动许多不同的 SDK 任务怎么办?这需要开始处理每个线程的 Looper 状态,检查它是否存在。
LocalBrodcastReceivers - 仅向 UI 线程返回指示
回调 - 传递接口,在工作线程 (B) 上返回指示。
共享内存 - 要求调用者线程 (A) 被阻塞,直到收到来自工作线程 (B) 的指示
- 管道 - 要求调用者线程 (A) 被阻塞,直到收到来自工作线程 (B) 的指示
此设计背后的目的是我无法预测 3rd 方应用程序将在 SDK 回调中执行的工作量,因此我不希望它发生在我的一个线程池工作人员身上。
此外,我特别谈论 2 个非 ui 线程,因为其中之一是 ui 线程,那里有很多好的解决方案。
有什么想法吗?
【问题讨论】:
标签: java android multithreading