开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情
上一篇文章,我们一起学习了 Java 的线程重拾 Java 高并发编程:线程 。今天我们继续来介绍 Java 并发编程中的两种异步编程模型。
无返回值异步模型
无返回值异步模型:直接将任务丢进线程或线程池中运行,此时,无法直接获得任务的执行结果数据。不过,有一种方式是可以使用回调方法来获取任务的运行结果。
具体实现方案是:定义一个回调接口,并在接口中定义接收任务结果数据的方法,具体逻辑在回调接口的实现类中完成。将回调接口与任务参数一同放进线程或线程池中运行,任务运行后调用接口方法,执行回调接口实现类中的逻辑来处理结果数据。
- 首先定义一个回调接口。这里定义了一个泛型接口,是为了接口的通用性。
package com.zhongger.threadLearn;
/**
* @author zhongmingyi
* @date 2023/2/4 10:59 下午
*/
public interface MyTaskCallable<T> {
T callback(T t);
}
- 定义任务结果数据的封装类。
public class MyTaskResult {
private String result;
public void setResult(String result) {
this.result = result;
}
public String getResult() {
return result;
}
@Override
public String toString() {
return "MyTaskResult{" +
"result='" + result + ''' +
'}';
}
}
- 创建回调接口的实现类。回调接口的实现类主要用来对任务的返回结果进行相应的业务处理。实现类需要实现回调接口中的方法。
public class MyTaskHandler implements MyTaskCallable<MyTaskResult> {
@Override
public MyTaskResult callback(MyTaskResult s) {
System.out.println(s.toString());
return s;
}
}
- 创建任务执行类。该任务执行类继承 Thread 类,实现 run 方法。其成员变量有中回调接口,并在 run 方法中调用回调接口来获取线程异步执行的结果
public class MyTaskExecutor extends Thread {
private MyTaskCallable<MyTaskResult> callable;
public MyTaskExecutor(MyTaskCallable<MyTaskResult> callable) {
this.callable = callable;
}
@Override
public void run() {
MyTaskResult result = new MyTaskResult();
result.setResult("异步任务结果");
callable.callback(result);
}
}
- 创建主函数,运行线程,异步任务执行完成后,通过回调接口来获取异步任务执行的结果:
public class MyTaskTest {
public static void main(String[] args) {
MyTaskCallable<MyTaskResult> handler = new MyTaskHandler();
MyTaskExecutor executor = new MyTaskExecutor(handler);
executor.start();
}
}
- 输出结果如图:
也就是说,当我们的线程执行完异步任务后,就能够通过回调方法获取到对应的结果值了。如果大家有兴趣尝试线程池的异步回调,也可以写代码一起交流噢~