Future 接口是 JDK1.5 开始提供,它的作用是异步获取线程计算的结果。


看一个等待、获取任务执行结果的例子:

package constxiong.interview;
import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;
/** * 测试 Future * @author ConstXiong * @date 2020-01-02 16:49:03 */public class TestFuture {
    private static ExecutorService executor = Executors.newSingleThreadExecutor();        public static void main(String[] args) throws InterruptedException, ExecutionException {        //去除 Helle 2020 空格,判断任务执行状态,输出等待信息        Future<String> future = removeBlank("Helle 2020");        while (!future.isDone()) {            Thread.sleep(1000L);            System.out.println("等待1秒");        }        System.out.println(future.get());        executor.shutdown();    }        /**     * 移除字符串中的空白符号     * @param str     * @return      */    private static Future<String> removeBlank(String str) {        return executor.submit(() -> {            Thread.sleep(3000L);            return str.replace(" ", "");        });    }    }


可以看出 Future 接口里的 isDone() 方法可以判断任务是否已经执行完成,get() 方法可以获取到任务的执行结果
Future 接口包含 5 个方法如下:

boolean cancel(boolean mayInterruptIfRunning);//取消任务boolean isCancelled();//判断任务是否已取消  boolean isDone();//判断任务是否已结束get();//获得任务执行结果get(long timeout, TimeUnit unit);//获得任务执行结果,支持超时


Future 对象是由 ExecutorService 接口的 3 个提交任务的方法返回

Future<?> submit(Runnable task);//提交 Runnable 任务<T> Future<T> submit(Callable<T> task);//提交 Callable 任务<T> Future<T> submit(Runnable task, T result);//提交 Runnable 任务及结果引用,result 用于主线程和任务执行线程间通信


第 3 个接口通过 T result 可以在主线程和任务执行线程间进行通信
例子如下:

package constxiong.interview;
import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;
/** * 测试 Future * @author ConstXiong * @date 2020-01-02 16:49:03 */public class TestFuture {
 private static ExecutorService executor = Executors.newSingleThreadExecutor();
 public static void main(String[] args) throws Exception {    testGetReplaceBlankWithResult();  }
 private static void testGetReplaceBlankWithResult() throws Exception {    //用 Result 对象里的 str 字符串替换 Helle 2020 中的空格    Result r = new Result(" ConstXiong ");    Future<String> future = replaceBlank("Helle 2020", r);    System.out.println(future.get());    System.out.println(r.getStr());    executor.shutdown();  }
 /**   * 根据 Result 对象的 str 属性替换目标字符串中的空格,并且修改 Result 对象的 str   * @param str   * @return   */  private static Future<String> replaceBlank(String str, Result result) {    return executor.submit(() -> {      Thread.sleep(3000L);      String newStr = str.replace(" ", result.getStr());      result.setStr("大俊子");      return newStr;    });  }
}
class Result {
 private String str;
 public Result(String str) {    this.str = str;  }
 public String getStr() {    return str;  }
 public void setStr(String str) {    this.str = str;  }
}


更多相关文章

  1. Redis为什么又引入了多线程?作者也逃不过“真香定理”?
  2. 详解第三种创建线程的方式-Callable接口
  3. java线程相关面试题(第一版)
  4. Java线程之线程的调度-让步
  5. 【编测编学】接口测试面试题必背(下)
  6. java中的几个线程池的使用
  7. (不谈废话,只有干货)解决线程间协作问题的工具类Exchanger详解
  8. 一文看懂 Node.js 中的多线程和多进程[每日前端夜话0x107]

随机推荐

  1. Mars《Android开发视频教程》全集下载(第
  2. 详细Android Studio + NDK范例
  3. 如何扩大一个view的touch和click响应区域
  4. HttpURLConnection(java.net.CookieManage
  5. Android如何判断手机卡是SIM卡或者USIM卡
  6. 简单介绍Android应用特色及详解四大组件
  7. 什么在Android M中被弃用?
  8. Android 3.2 以上转屏,切换屏幕,横竖屏(onC
  9. Android-SurfaceView拍照录像
  10. ListView的上拉弹簧、下拉弹簧,下拉弹簧时