/*
* Futrue:扔一个任务需要一段时间,未来某个时间执行完了,会产生一个结果。
* Future是Callble的返回值
* FutureTask<Integer>:未来的任务,会有返回值,执行完的结果是一个Int类型
* 这个任务可以装一个Runnble任务
*
* FutureTask与Runnble做对比
* Runnble无返回值,run方法返回void
* FutureTask可以包装一个Callble类型(Callble里面的call方法有返回值是一个泛型),所以要把callble包装成一个任务,必须指定泛型的类型(通过FutureTask指定)
*
* 此处FutureTask包装了一个任务
*/
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
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;
/*
*
*/
public class Futrue_value {
public static void main(String[] args) throws InterruptedException, ExecutionException{
/*
* 单线程
*/
/*
* Futrue:扔一个任务需要一段时间,未来某个时间执行完了,会产生一个结果。
* Future是Callble的返回值
* FutureTask<Integer>:未来的任务,会有返回值,执行完的结果是一个Int类型
* 这个任务可以装一个Runnble任务
*
* FutureTask与Runnble做对比
* Runnble无返回值,run方法返回void
* FutureTask可以包装一个Callble类型(Callble里面的call方法有返回值是一个泛型),所以要把callble包装成一个任务,必须指定泛型的类型(通过FutureTask指定)
*
* 此处FutureTask包装了一个任务
*/
//装的Callable任务,线程里面可以执行Callable任务
FutureTask<Integer> task=new FutureTask<>(new Callable() {
public Integer call() throws Exception { //泛型指定返回Integer类型
TimeUnit.MILLISECONDS.sleep(500); //睡500毫秒
return 1000; //任务处理完,将来的返回值
}
});
/*
* 启动一个线程,让这个任务执行,500毫秒后结束
* 不能直接往Thread里面扔callble,必须先FutureTask包装Callable
* FutureTask执行完将来会有一个返回结果,等它执行完,task.get才能拿到结果
*/
new Thread(task).start();
//task.get()阻塞方法(等待任务执行完,才能拿到值),task.get()拿到返回的1000
System.out.println(task.get());
/********************************************************************/
/*
* 线程池
*/
ExecutorService service=Executors.newFixedThreadPool(5); //起5个线程的一个线程池
/*
* Futrue的用法拿到未来的返回值
*/
//submit可以直接往里面扔一个Callable,submit里面已经new了一个FutureTask
Future<Integer> f=service.submit(new Callable(){
public Intger call() throws Exception { //往这里面扔了一个任务
TimeUnit.MILLISECONDS.sleep(500); //该任务睡了500毫秒
return 1; //返回来的结果直接放到Future里面
}
});
System.out.println(f.get()); //阻塞,什么时候执行完什么时候拿到结果1
/*
* 判断任务执行完没有,主线程启动了另外的线程,然后主线程直接问执行完了没有(肯定没有执行完)---所以false
* 当然如果使用完f.get()方法,再问,当然就是true
*/
System.out.println(f.isDone());
}
}