标签:interrupt stack star 执行 string return highlight throw call()
Future 接口对于具体的Runnable 或者 Callable 任务的执行结果进行取消、查询是否完成、获取结果。 get() 方法获取结果会产生阻塞,会一直等到任务执行完毕才返回。 V get(long timeout, TimeUnit unit) 获取执行结果,如果在指定的时间内,没有获取到结果,则返回null。
Future 提供三种功能: 判断任务是否完成、能够中断任务、能够获取任务执行结果。
FutureTask 类 继承 Runnable和 Future 接口。所以它既可以作为Runnable 被线程执行,又可以作为Future 得到Callable 的返回值。
package fork.task; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; /** * <p>Description:TODO </p> * @author zhoudingzhao * @date 2019年4月8日 下午2:01:16 * @version 1.0 */ public class FutureTaskDemo { public static void main(String[] args) throws InterruptedException, ExecutionException { SonTask task1 = new SonTask("Thread son1"); FutureTask<String> f1 = new FutureTask<String>(task1); //传入 Callable 参数,FutureTask 实例的 get() 结果是 Callable 的返回结果。
new Thread(f1).start(); FutureTask<Integer> f2 = new FutureTask<Integer>(new MyRun(),22); // 传入 Runnable 参数,则 第二个参数就是 FutureTask 实例的 get() 结果。 new Thread(f2).start(); System.out.println(f1.get()); System.out.println("result_" + f2.get()); } } class SonTask implements Callable<String> { private String name = ""; SonTask(String name) { this.name = name; } public String call() throws Exception { Thread.sleep(1000L); System.out.println(name + "任务计算完成"); return "result_11"; } } class MyRun implements Runnable { public void run() { try { Thread.sleep(10L); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("特定线程2完成"); } }
输出:
特定线程2完成
Thread son1任务计算完成
result_11
result_22
在 f1 和 f2 先后start 执行的情况下, f2 只 sleep 了 10毫秒, 所以先打印 特定线程2完成 ,但是 由于在 f2.get() 之前 先执行 了 f1.get() , 因此需要等待 f1 执行完成。 再输出 f2.get() .
标签:interrupt stack star 执行 string return highlight throw call()
原文地址:https://www.cnblogs.com/z360519549/p/10670352.html