当前位置:网站首页>获取线程返回值Future接口与FutureTask类使用介绍

获取线程返回值Future接口与FutureTask类使用介绍

2022-04-23 14:07:00 pureluckyfish

        启动一个线程,计算机根据cpu及内存的使用情况,在未来的时间点执行线程内的代码。怎么知道线程是否执行完成,结果是什么呢?Future英文意思“未来、将来的”,顾名思义Future接口应运而生。
       一、Future接口介绍

       使用方法get进行检索,必要时阻塞,直到它准备好。cancel方法执行取消操作。提供了其他方法来确定任务是正常完成还是被取消。一旦计算完成,就不能取消计算。如果为了可取消而使用Future,但不提供可用的结果,可以声明Future>,并返回null作为底层任务的结果。

返回值 方法名称 方法用途描述
boolean cancel(boolean mayInterruptIfRunning) 尝试取消此任务的执行。如果任务已经完成、已经被取消或由于其他原因无法取消,则此尝试将失败。如果成功,并且在调用cancel时该任务没有启动,则该任务永远不应该运行。如果该任务已经启动,则mayInterruptIfRunning参数确定执行该任务的线程是否应该中断以试图停止该任务
boolean isCancelled() 如果此任务在正常完成之前被取消,则返回true
boolean isDone() 如果此任务完成则返回true
V get() 获取线程执行结果,会一直等待,直到线程执行完成
V get(long timeout, TimeUnit unit) 获取线程执行结果,如果在指定时间内没有获取到结果则会抛出异常

二、Future代码示例

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

import org.junit.Test;

public class Future_FutureTask {
	//创建线程池
	ExecutorService exec = Executors.newCachedThreadPool();

	@Test
	public void FutureTest() throws Exception {
		//返回Future
		Future<?> future = exec.submit(() -> {
			System.out.println("Runnabel接口,沒有返回值");
		});
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		if (future.isDone()) {
			System.out.println("获取线程返回结果:" + future.get());
		} else {
			System.out.println("获取线程返回结果:" + future.get(10L, TimeUnit.SECONDS));
		}
		System.out.println("线程是否被取消" + future.isCancelled());

	}
}

三、FutureTask实现类介绍

        该类提供了Future接口的基本实现;FutureTask可以用来包装成 Callable 或者 Runnable 对象来使用。因为FutureTask实现了Runnable接口,所以FutureTask可以提交给Executor执行

四、FutureTask代码示例

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;

import org.junit.Test;

public class Future_FutureTask {
	// 创建线程池
	ExecutorService exec = Executors.newCachedThreadPool();

	@Test
	public void FutureTaskTest() throws Exception {
		// 使用Lambda 表达式创建对象
		// FutureTask<V> futureTask = new FutureTask<V>(Callable<V> callable)
		FutureTask<String> futureTask = new FutureTask<String>(() -> {
			return "FutureTask使用介绍";
		});
		exec.execute(futureTask);
		System.out.println("获取FutureTask的返回结果:" + futureTask.get());

	}
}

五、总结

        Future表示异步计算(线程)的结果。提供的方法用于检查计算是否完成、等待其完成以及检索计算的结果。

        FutureTask类是Future接口的实现类

版权声明
本文为[pureluckyfish]所创,转载请带上原文链接,感谢
https://blog.csdn.net/sinat_33918956/article/details/118652810