异步执行线程并可以得到返回值

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
*
* @author Kaiwii Ho
* Callable类就是一个有返回值的任务
* 对于任务与Thread之间的关系,可以这样子理解:
* Callable类的实例就是一个锦囊妙计;而Thread就是执行这个锦囊妙计的过程
*
* FutureTask类(Future接口的一个实现)就是一个监视器:检测着被若干个异步线程操作的变量的一个类
*
* 代码演示了主线程如何通过使用Callable类和FutureTask类,实现:
* 主线程一边等待子线程的处理结果,一边完成自己的工作。
*
*考虑以下一个小黑工kaiwii的故事……
*/
public class TestFutureTask {



/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//准备一份工作给一个打工仔employee叫Kaiwii
Employee kaiwii=new Employee("kaiwii");
//新建一个监工头inspector
FutureTask<Double>inspector=new FutureTask<Double>(kaiwii);
//让kaiwii这个打工仔工作
System.out.println("老板发话,让kaiwii这个打工仔工作吧!");
new Thread(inspector).start();
System.out.println("老板开始数钱!");
//老板一边数钱,一边命令监工inspector监视Kaiwii工作;一旦kaiwii完成工作就拿来让他检查
while(!inspector.isDone()){
System.out.println("老板数钱中……");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
//老板交监工inspector将kaiwii的结果呈上来以便他验收kaiwii计算出来的结果
try {
System.out.println("老板发现kaiwii的结果是:"+inspector.get());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}

//子线程
class Employee implements Callable<Double>{
String employee_name;

private void setEmployee_name(String employee_name) {
this.employee_name = employee_name;
}

public Employee(String employee_name) {
setEmployee_name(employee_name);
}
@Override
public Double call() throws Exception {
// TODO Auto-generated method stub
System.out.println("工人"+employee_name+"说:我开始工作了!!!!");
for(int i=1;i<=10;i++){
System.out.println("工人"+employee_name+" 第"+i+"次说:我在工作呢!!!!");
Thread.sleep(1000);
}
System.out.println("工人"+employee_name+"说:我搞好了!!!!");
return Math.random();
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中异步执行方法并且有返回值的方式可以通过使用@Async和CompletableFuture实现。首先,在Spring Boot应用程序中使用@Async注解标注一个异步方法,然后在调用该方法时,使用CompletableFuture对象获取异步执行的结果。下面是一个示例代码: ``` @Service public class MyService { @Async public CompletableFuture<String> asyncMethod() throws InterruptedException { Thread.sleep(5000); String result = "异步方法执行结果"; return CompletableFuture.completedFuture(result); } } ``` 在上述代码中,我们使用@Async注解标注了一个异步方法asyncMethod(),该方法调用后会在新的线程异步执行。同时,我们使用CompletableFuture返回异步方法的执行结果。您可以将该方法注入到需要调用它的代码中,然后使用CompletableFuture对象获取返回结果。 ``` @RestController public class MyController { @Autowired private MyService myService; @GetMapping("/async") public CompletableFuture<String> async() throws InterruptedException { return myService.asyncMethod(); } } ``` 在上述代码中,我们注入了MyService服务,并将它的异步方法asyncMethod()在MyController中暴露成RESTful API。在async()函数中,我们仅仅返回MyService的异步方法引用,并没有实际等待异步方法的执行结果。可以理解为async()方法需要返回一个Promise对象,该对象代表异步执行的结果。需要注意的是,我们在MyService的异步方法中使用CompletableFuture.completedFuture方法,将异步方法的执行结果result进行封装,这样我们就可以在async()方法中通过CompletableFuture对象获取异步方法的执行结果了。 综上所述,以上是Spring Boot中异步执行方法并且有返回值的方式,希望能对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值