Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Multithreading_Java.util.concurrent - Fatal编程技术网

Java 当线程需要不同的执行时间时,如何执行不同的操作?

Java 当线程需要不同的执行时间时,如何执行不同的操作?,java,multithreading,java.util.concurrent,Java,Multithreading,Java.util.concurrent,存在一个rest服务,它执行一些计算并将结果打印到excel文件中,并作为响应返回。。随着数据的增加,我们希望实现以下行为。如果文件在3秒内准备就绪,请返回excel或发送文本消息。。然后将文件邮寄给用户 有什么建议吗,我们如何用Java实现这个功能 使用带有超时的Future: public String getExel() { CompletableFuture<String> getter = CompletableFuture.supplyAsync(() ->

存在一个rest服务,它执行一些计算并将结果打印到excel文件中,并作为响应返回。。随着数据的增加,我们希望实现以下行为。如果文件在3秒内准备就绪,请返回excel或发送文本消息。。然后将文件邮寄给用户


有什么建议吗,我们如何用Java实现这个功能

使用带有超时的
Future

public String getExel() {
     CompletableFuture<String> getter = CompletableFuture.supplyAsync(() -> "result");
     try {
        return getter().get(3, TimeUnits.SECONDS);
     } catch(TimeoutException ex) {
       // invoke email sending
       getter.thenAcceptAsync(result -> sendEmail(result));

       // I will send you email later
       return "XXx to indicate you will send him later";
     }
}

public void sendEmail(String resultFromGetExel) {

}
公共字符串getExel(){
CompletableFuture getter=CompletableFuture.SupplySync(()->“结果”);
试一试{
return getter().get(3,TimeUnits.SECONDS);
}捕获(TimeoutException例外){
//调用电子邮件发送
getter.thenaccessync(结果->发送电子邮件(结果));
//我稍后会给你发电子邮件
返回“XXx表示您稍后会发送给他”;
}
}
public void sendmail(字符串resultFromGetExel){
}

使用带有超时的
未来

public String getExel() {
     CompletableFuture<String> getter = CompletableFuture.supplyAsync(() -> "result");
     try {
        return getter().get(3, TimeUnits.SECONDS);
     } catch(TimeoutException ex) {
       // invoke email sending
       getter.thenAcceptAsync(result -> sendEmail(result));

       // I will send you email later
       return "XXx to indicate you will send him later";
     }
}

public void sendEmail(String resultFromGetExel) {

}
公共字符串getExel(){
CompletableFuture getter=CompletableFuture.SupplySync(()->“结果”);
试一试{
return getter().get(3,TimeUnits.SECONDS);
}捕获(TimeoutException例外){
//调用电子邮件发送
getter.thenaccessync(结果->发送电子邮件(结果));
//我稍后会给你发电子邮件
返回“XXx表示您稍后会发送给他”;
}
}
public void sendmail(字符串resultFromGetExel){
}

让我们看看,从main方法,我们创造了一个未来,将收集数据,准备excel表格。。。大体上,我们等待3秒,这个未来将返回excel..并且返回excel。一切都好。。。但是,如果超过3秒,我们希望从main方法返回一个字符串,继续处理excel,然后发送邮件。。我们怎么能做到呢?创建的线程返回excels或邮件。getter有3s超时。如果它在3秒内完成,您可以使用它返回excel。否则它会抛出timeoutexception,您可以在该Catch中处理电子邮件发送。如果线程在10秒后完成,我们已经处理了超时异常,并向用户返回了一个字符串,该文件将在稍后发送。。如果catch已经用于返回字符串消息,那么我们将如何和何时发送邮件,以及如何检查线程是否完成?通常使用
thenaccessync
调用第二个路径。阅读我编辑的答案,从main方法看,我们创造了一个未来,将收集数据,准备excel表格。。。大体上,我们等待3秒,这个未来将返回excel..并且返回excel。一切都好。。。但是,如果超过3秒,我们希望从main方法返回一个字符串,继续处理excel,然后发送邮件。。我们怎么能做到呢?创建的线程返回excels或邮件。getter有3s超时。如果它在3秒内完成,您可以使用它返回excel。否则它会抛出timeoutexception,您可以在该Catch中处理电子邮件发送。如果线程在10秒后完成,我们已经处理了超时异常,并向用户返回了一个字符串,该文件将在稍后发送。。如果catch已经用于返回字符串消息,那么我们将如何和何时发送邮件,以及如何检查线程是否完成?通常使用
thenaccessync
调用第二个路径。阅读我编辑的答案