重拾 Java 高并发:两种异步模型(一)

346 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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();
    }
}
  • 输出结果如图:

image.png

也就是说,当我们的线程执行完异步任务后,就能够通过回调方法获取到对应的结果值了。如果大家有兴趣尝试线程池的异步回调,也可以写代码一起交流噢~