多线程之future,futureTask

Callable与Runable的区别 

(1)Callable规定的方法是call(),Runnable规定的方法是run().
(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得
(3)call方法可以抛出异常,run方法不可以
(4)运行Callable可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可了解任务执行情况,可取消任务的执行,还可获取执行果。

最重要的是Callable通常用来获取一个异步计算的结果,它不需要等待线程执行完毕,通常计算的时间会比较长,它返回一个Future对象,future实现的原理也是使用wait和notify来控制计算过程。当调用future.get()方法获取计算结果时候,如果还没计算完毕,先阻塞线程,直到计算完毕才返回结果。

二,Future和FutureTask

(1)Executor是Runnable和Callable的调度容器,Future就是对于具体的调度任务的执行结果进行查看,最为关键     的是Future可以检查对应的任务是否已经完成,也可以阻塞在get方法上一直等待任务返回结果。

(2)FutureTask则是一个RunnableFuture<V>,即实现了Runnbale又实现了Futrue<V>这两个接口,另外它还可       以包装Runnable和Callable<V>,所以一般来讲是一个符合体了,它可以通过Thread包装来直接执行,也可以      提交给ExecuteService来执行,并且还可以通过v get()返回执行结果,在线程体没有执行完成的时候,主线程    一直阻塞等待,执行完则直接返回结果。

public class FutureTaskTest {
	// 创建一个计算任务,返回累加结果,构造器的参数是上界
	static class SumCaller implements Callable<Long> {
		private Integer count;

		public SumCaller(Integer count) {
			this.count = count;
		}

		public Long call() throws Exception {
			long sum = 0;
			for (int i = 0; i < count; i++) {
				sum += i;
			}
			return sum;
		}
	}

	private static Integer COUNT = 1000000000;

	public static void main(String[] args) throws InterruptedException,
			ExecutionException {
		SumCaller caller = new SumCaller(COUNT);
		//1.使用FutureTask提交线程
		FutureTask<Long> task = new FutureTask<Long>(caller);
		Thread thread = new Thread(task);
		thread.start();
		//2.使用线程池方法提交FutureTask
		//ExecutorService es = Executors.newCachedThreadPool();//创建线程池对象
		//es.submit(task);
		//3.使用线程池方法提交callable
		//ExecutorService es = Executors.newCachedThreadPool();//创建线程池对象
		//Future f1 = es.submit(caller);
		//long sum = f1.get(); 
		long sum = task.get(); //返回值为 call()函数的返回值
		System.out.println("sum from 1 to " + COUNT + " result = " + sum);

	}
}

如以上代码中创建了一个callable来进行一个大计算,可以用实例中3中方法来操作计算线程获取结果。




     

你可能感兴趣的:(多线程之future,futureTask)