package cn.com; import java.util.concurrent.*; /** * Copyright (C), 2018-2019 * Callable、Future、FutureTask的用法 * @Description: TODO * @Author: zhou * @Create: 2019/10/10 17:50 * @Version 1.0.0 */ public class ExecutorServiceTest { /** * Callable、Future 出现的缘由: * 咱们所熟知的建立线程的两种方式,直接继承Thread,或者实现Runnable接口. * 对于这两种方式,有个通用的缺陷: 在执行完成任务后没法获取执行结果。 * 若是须要获取执行结果,就必须经过共享变量或者使用线程通讯的方式来达到效果,这样使用起来就比较麻烦。 * * java 1.5开始,提供了Callable和Future,经过它们能够在任务执行完毕以后获得任务执行结果。 * * Callable接口表明一段能够调用并返回结果的代码;Future接口表示异步任务,是尚未完成的任务给出的将来结果。 * 因此说Callable用于产生结果,Future用于获取结果。 * * Future介绍 * 在Future接口中声明了5个方法,下面依次解释每一个方法的做用: * cancel方法用来取消任务,若是取消任务成功则返回true,若是取消任务失败则返回false。参数mayInterruptIfRunning表示是否容许取消正在 * 执行却没有执行完毕的任务,若是设置true,则表示能够取消正在执行过程当中的任务。若是任务已经完成,则不管mayInterruptIfRunning为true * 仍是false,此方法确定返回false,即若是取消已经完成的任务会返回false;若是任务正在执行,若mayInterruptIfRunning设置为true,则 * 返回true,若mayInterruptIfRunning设置为false,则返回false;若是任务尚未执行,则不管mayInterruptIfRunning为true仍是false,确定返回true。 * isCancelled方法表示任务是否被取消成功,若是在任务正常完成前被取消成功,则返回 true。 * isDone方法表示任务是否已经完成,若任务完成,则返回true; * get()方法用来获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回; * get(long timeout, TimeUnit unit)用来获取执行结果,若是在指定时间内,还没获取到结果,就直接返回null。 * 也就是说Future提供了三种功能: * 1)判断任务是否完成;2)可以中断任务;3)可以获取任务执行结果。 * 由于Future只是一个接口,因此是没法直接用来建立对象使用的,所以就有了下面的FutureTask。FutureTask是Future惟一实现接口。 */ private static String callReturnStr ; public static void main(String[] args) throws ExecutionException, InterruptedException { System.out.println(CallableTest()); RunnableTest(); } public static String CallableTest(){ ExecutorService executorService = Executors.newFixedThreadPool(1);// 申请一个固定长度的线程池 try { // 建立一个任务,返回一个string Callable<String> callable = new Callable<String>() { @Override public String call() throws Exception { Thread.sleep(200); callReturnStr = Thread.currentThread().getName() + " --CallableTest"; return callReturnStr; } }; /** * 第一种方式:直接使用 ExecutorService的submit返回一个 Future */ //Future<String> future = executorService.submit(callable); // 执行任务 //callReturnStr = future.get(150, TimeUnit.MILLISECONDS); // 设置超时时间 /** * 第二种方式: */ FutureTask<String> futureTask = new FutureTask<String>(callable); executorService.execute(futureTask); callReturnStr = futureTask.get(150, TimeUnit.MILLISECONDS); if(futureTask.isDone()){ System.out.println("执行完成。"); executorService.shutdown(); } } catch (InterruptedException e) { //中端异常处理 e.printStackTrace(); callReturnStr = "中端异常处理"; executorService.shutdown(); // 结束线程 } catch (ExecutionException e) { //线程执行异常处理 e.printStackTrace(); // 结束线程 callReturnStr = "线程执行异常处理"; executorService.shutdown(); } catch (TimeoutException e) { //超时异常处理 e.printStackTrace(); // 结束线程 System.out.println("超时异常处理返回结果:" + callReturnStr); // 超时的返回结果 callReturnStr = "超时异常处理"; executorService.shutdown(); } return callReturnStr; } public static void RunnableTest(){ ExecutorService executorService = Executors.newFixedThreadPool(1);// 申请一个固定长度的线程池 try { Runnable runnable = new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + "--RunnableTest"); } }; /** * ExecutorService接口中声明了若干个submit方法的重载版本 * submit(Runnable task, T result); * 其中 result是自定义的返回结果 */ //Future future = executorService.submit(runnable); // 执行任务 Future future = executorService.submit(runnable, "自定义结果!"); // 执行任务 future.get(150, TimeUnit.MILLISECONDS); // 设置超时时间 if(future.isDone()){ System.out.println("执行完成。"); executorService.shutdown(); } } catch (InterruptedException e) { //中端异常处理 e.printStackTrace(); callReturnStr = "中端异常处理"; executorService.shutdown(); // 结束线程 } catch (ExecutionException e) { //线程执行异常处理 e.printStackTrace(); // 结束线程 callReturnStr = "线程执行异常处理"; executorService.shutdown(); } catch (TimeoutException e) { //超时异常处理 e.printStackTrace(); // 结束线程 System.out.println("超时异常处理返回结果:" + callReturnStr); // 超时的返回结果 callReturnStr = "超时异常处理"; executorService.shutdown(); } } }
参考:https://blog.csdn.net/vking_wang/article/details/9470499java