【发布时间】:2021-07-04 21:24:55
【问题描述】:
我正在尝试编写一个并行调用 API 的应用程序。虽然,由于某种原因,只要我调用 需要 多次调用的方法,它就不会阻塞父(主)......我已经在网上看到了大量的代码使用 ExecutorService 对象等等,但我的问题是我需要这个线程异步运行,这意味着我不能将调用分组到列表或循环中。
这是我得到的:
// This is the method I call from the outside.
public static String callAPI(String _from, String _to, String _text) {
APIThread t = new APIThread (_from, _to, _text);
return t.getResult();
}
然后,在 APIThread 中:
public class APIThread implements Runnable {
private Thread thread;
private String data;
public APIThread(...) {
this.thread = new Thread(this);
this.thread.start();
}
@Override
public void run() {
this.data = doSomeAPIWork();
}
public String getResult() {
return this.data;
}
public String doSomeAPIWork() {
// Use HttpUrlConnection to grab stuff and put it in StringBuilder - return as String
}
}
这实际上就是我所拥有的 - 只是“伪代码”形式(因为 API 的细节无关紧要)。子线程启动,立即从方法中返回(也就是说APIThread类还没来得及设置数据实例。我感觉这真的很简单,我只是做错了。
编辑:澄清一下,我想要多线程的原因是因为 API 调用是零星的——这意味着我可以一次从程序中的不同位置获取十个左右,并且因为请求大约需要一秒钟或所以,我真的很希望有一个线程池等待执行作业,这意味着,如果我们遇到一个工作,就去做,然后如果我们遇到另一个,同时做那个。换句话说,我希望主线程看到一个 callAPI() 方法,对其进行处理,将其发送到一个线程,然后在其他地方继续(这意味着可能会找到另一个 callAPI() 调用)。
【问题讨论】:
-
如果你分离一个线程,然后什么都不做,只等待结果(原始线程块),那么启动那个线程是没有意义的。异步工作的目标是释放原始线程以做其他事情。如果我误解了您的意图,请编辑您的问题以澄清。
-
@BasilBourque 添加。
-
同样的问题。如何做到这一点:
return t.getResult();无需坐在那里等待后台线程完成?在做庭院工作时,如果你站在软管旁边等着,让你的孩子装满一桶水有什么意义呢?您不妨自己装满桶,而不涉及您的孩子(隐喻的第二条线索)。 -
@BasilBourque 这就是我的问题所在。我不想要后台线程只是坐在那里完成。我想要一个线程来完成这项工作(这可能意味着我需要为 THIS 方法生成一个线程......)并从该线程返回结果......这有意义吗?
-
但是就像我说的,我可能同时收到几个请求,这意味着,是的,虽然我可以自己拿起软管并装满桶,但我想把它典当如果我必须做其他事情,我的孩子(在我的代码示例中,如果有请求进来,我会把它丢给一个孩子,以便它可以处理它,以防我找到另一个请求)。
标签: java multithreading api http