Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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 slack sdk客户端如何使调用异步_Java_Spring_Http_Asynchronous - Fatal编程技术网

Java slack sdk客户端如何使调用异步

Java slack sdk客户端如何使调用异步,java,spring,http,asynchronous,Java,Spring,Http,Asynchronous,我正试图在java中使用slack的sdk客户端进行调用,以便通过使用电子邮件名称获取用户id。slack客户端返回CompletableFuture对象。如果我使用get()方法,我可以得到用户名,但据我所知,这是一个同步函数,它会使应用程序变慢。是否有其他方法使此调用异步 public static String lookUpUserId(String email) throws ExecutionException, InterruptedException { Compl

我正试图在java中使用slack的sdk客户端进行调用,以便通过使用电子邮件名称获取用户id。slack客户端返回
CompletableFuture
对象。如果我使用get()方法,我可以得到用户名,但据我所知,这是一个同步函数,它会使应用程序变慢。是否有其他方法使此调用异步

public static String lookUpUserId(String email) throws ExecutionException, InterruptedException {

       CompletableFuture<UsersLookupByEmailResponse> response = slackClient.usersLookupByEmail(r -> r
        .email(email));

       UsersLookupByEmailResponse data = response.get();

       return data.getUser().getId();
}

我对slack api不太了解,但是可以找到一些关于在
实现可运行
的类中容纳函数的信息

Make your `CompletableFuture` in the constructor and run your gets in `run()`. 
在我看来,在主线程之外处理所有api请求是一种最佳实践,但您应该知道,在一行上的单独线程中运行某件事情,然后在下一行上连接该线程只会增加一点开销,而不会带来任何性能优势如果您正在处理一批请求,则应在独立的线程上启动每个请求,并使用
for循环
,然后将它们全部连接在一起


我还注意到,我的参考答案并没有真正涵盖检索结果的线程连接,所以您可能也会发现信息丰富。如果你还没有学会面向对象编程,那没关系!你会的


由于调用返回
CompletableFuture
,因此它总是异步的。是的,
get
()方法是一个同步函数。使用它不会使应用程序变慢,它会使应用程序消耗更多内存。异步访问类

   response.thenApply(r->r.getUser().getId());
看起来不错

产生错误消息的原因是方法
lookUpUserId
被声明为返回字符串,因此必须有一个返回语句。如果要使其异步,则将其声明为returning
CompletableFuture
,并添加return语句

 return response.thenApply(r->r.getUser().getId());

嗯,同步不意味着它将锁定主线程,使其无法运行吗?因此,它会使它变慢,因为事情将无法并行运行。这就是我的理解?事情总是可以并行运行的——只需创建更多线程。异步编程使用的线程数可能比普通多线程编程少,但并行化的程度取决于算法的设计方式,同一个算法可以用同步和异步两种方式表示,CompletableFuture未按时完成,因此我无法从返回值中获取值@Alexei我想在应用之后我仍然需要使用get()?这样做有效。。。但不确定这是否是异步的
   response.thenApply(r->r.getUser().getId());
 return response.thenApply(r->r.getUser().getId());