多线程2

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() .

原文地址:https://www.cnblogs.com/z360519549/p/10670352.html