futuretask java 并发请求_Java并发案例04---Future和 FutureTask

4.Future和 FutureTask

4.1 Future是Callable的返回结果。

它有三个功能

1.判断任务是否完成

2.能够中断任务

3.能够获取任务返回结果

4.2 FutureTask

FutureTask 实现了RunnableFuture接口,RunnableFuture这个接口又继承自Runnable和Future

因此FutureTask 既可以作为Runnable被线程执行(通过包装Callable对象),又可以作为Future得到Callable返回值。

public FutureTask(Callable callable) {

if (callable == null)

throw new NullPointerException();

this.callable = callable;

this.state = NEW; // ensure visibility of callable

}

public FutureTask(Runnable runnable, V result) {

this.callable = Executors.callable(runnable, result);

this.state = NEW; // ensure visibility of callable

}

两个构造方法,FutureTask接口是Future的唯一实现类。

实现了Callable的对象

class Task implements Callable {

@Override

public String call() throws Exception {

TimeUnit.SECONDS.sleep(5);

System.out.println("我睡了5s");

return "success";

}

}

方法1:通过FutureTask包装task,然后使用Thread的方式执行

public static void main(String[] args) throws InterruptedException, ExecutionException {

Task task = new Task();

/**

* 用FutureTask包装Task对象,然后给thread去执行

*/

FutureTask ft = new FutureTask(task);

new Thread(ft).start();

System.out.println("主线程获取运行结果为:"+ft.get());

}

方法2:通过FutureTask包装task,然后使用线程池的方式执行

public static void main(String[] args) throws InterruptedException, ExecutionException {

ExecutorService executorService = Executors.newCachedThreadPool();

Task task = new Task();

/**

* 用FutureTask包装Task对象,然后给线程池去执行

*/

FutureTask ft = new FutureTask(task);

Future result = executorService.submit(task);

executorService.shutdown();

System.out.println("主线程获取运行结果为:"+result.get());

}

方法3:直接使用线程池提交Callable对象

public static void main(String[] args) throws InterruptedException, ExecutionException {

ExecutorService executorService = Executors.newCachedThreadPool();

Task task = new Task();

Future result = executorService.submit(task);

executorService.shutdown();

System.out.println("主线程获取运行结果为:"+result.get());

}

总结

Future是一个接口, FutureTask类是Future 的一个实现类,并实现了Runnable,因此FutureTask可以传递到线程对象Thread中新建一个线程执行。所以可通过Excutor(线程池) 来执行,也可传递给Thread对象执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值