开发者

Java异步编程之Callbacks与Futures模型详解

开发者 https://www.devze.com 2023-03-25 10:33 出处:网络 作者: 爱我-中华
目录一、Callbacks模型1.1示例1.2运行结果二、Futures模型2.1用例2.1用例结果三、Future接口四、小结一、Callbacks模型
目录
  • 一、Callbacks模型
    • 1.1示例
    • 1.2运行结果
  • 二、Futures模型
    • 2.1用例
    • 2.1用例结果
  • 三、Future接口
    • 四、小结

      一、Callbacks模型

      该模型的异步方法,在异步任务完成之后调用,主线程没有异步线程的结果。经典模型如Swing’s EventListener模型(如果不了解可参考html如何实现button的click方法)

      1.1示例

      public class CallbackModel implements Callback, Runnable {
          @Override
          public void invoke() {
              System.out.println("这是异步回调的结果");
          }
          @Override
          public void run(编程客栈) {
              try {
                  System.out.println(Thread.currentThread().getName() + "::异步线程任务开始");
                  Thread.sleep(1000);
                  System.out.println(Thread.currentThread().getName() + "::异步线程任务结束");
                  invoke();
              } catch (InterruptedException e) {
                  e.printStackTrace();
              php}
          }
          public static void main(String[] args) {
              System.out.println(Thread.currentThread(android).getName() + "::主线程开始");
              new Thread(new CallbackModel(), "线程一").start();
              System.out.println(Thread.currentThread().getName() + "::主线程结束");
          }
      }
      interface Callback {
          void invoke();
      }
      

      1.2运行结果

      main::主线程开始

      main::主线程结束

      线程一::异步线程任务开始

      线程一::异步线程任务结束

      这是异步回调的结果

      二、Futures模型

      ​ 该模型的异步方法,立刻返回一个包装了结果的返回值Future,T即是包装的返回值,但返回值不可立即访问(异步方法为完成),Future对象包装了对它的访问。可以轮询对象,直到该值可用为止。

      2.1用例

      public class FutureModel {
      
          static class FutureTask implements Callable {
      
              @Override
              public Object call()  {
                  try {
                      System.out.println(Thread.currentThread().getName() + "::异步线程任务开始");
                      Thread.sleep(4000);
                      System.out.println(Thread.currentThread().getName() + www.devze.com"::异步线程任务结束");
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
      开发者_JAVA学习            return "1234";
              }
          }
      
      
          public static void main(String[] args) {
              ExecutorService pool = Executors.newSingleThreadExecutor();
              Future<String> submit = pool.submit(new FutureTask());
              try {
                  System.out.println(Thread.currentThread().getName() + "返回的结果::" + submit.get());
              } catch (InterruptedException e) {
                  e.printStackTrace();
              } catch (ExecutionException e) {
                  e.printStackTrace();
              }finally {
                  pool.shutdown();
              }
          }
      }

      2.1用例结果

      pool-1-thread-1::异步线程任务开始

      pool-1-thread-1::异步线程任务结束

      main返回的结果::1234

      三、Future接口

      /**
      *异步计算的结果
      */
      public interface Future<V> {
      
          /**
           * 尝试取消任务,有可能失败
           */
          boolean cancel(boolean mayInterruptIfRunning);
      
          /**
           * 判断是否取消
           *
           * @return {@code true} if this task was cancelled before it completed
           */
          boolean isCancelled();
      
          /**
           *  * 判断是否完成
           *
           * @return {@code true} if this task comple编程客栈ted
           */
          boolean isDone();
      
          /**
           * 等待直至获取结果
           */
          V get() throws InterruptedException, ExecutionException;
      
          /**
           * 等待指定的时间获取结果,否则抛出异常
           */
          V get(long timeout, TimeUnit unit)
              throws InterruptedException, ExecutionException, TimeoutException;
      }

      四、小结

      1.两种模型还是基于Java的Runnable接口和Callable接口

      2.Runnable接口配合Thread创建线程,通常不关注返回结果。

      3.Callable接口配合Executors(java提供的线程池管理工具)与Future(封装返回结果),常用场景是主线程需要获取异步的结果。

      到此这篇关于Java异步编程之Callbacks与Futures模型详解的文章就介绍到这了,更多相关Java Callbacks Futures内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

      0

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      关注公众号