先上一个场景:假如你忽然想作饭,可是没有厨具,也没有食材。网上购买厨具比较方便(慢),食材去超市买更放心(快)。java
实现分析:在快递员送厨具的期间,咱们确定不会闲着,能够去超市买食材。因此,在主线程里面另起一个子线程去网购厨具。买好食材后,我就开始等待厨具到来。ide
FutureTask是Futura和Callable的组合体。Callable是一个支持返回值的Thread。this
package com.test;.net
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;
import java.util.concurrent.TimeoutException;线程
public class FutureCook {get
public static void main(String[] args) throws InterruptedException, ExecutionException, TimeoutException {
ExecutorService exec = Executors.newCachedThreadPool(); //建立一个线程池
Future<String> hello = exec.submit(new Task("test"));
try {
System.out.println("11111111111");
System.out.println(hello.get(););
System.out.println(hello.get(1000l,TimeUnit.MILLISECONDS)); //经过调用Future的get方法,获取线程的返回值
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println("22222222222");
long startTime = System.currentTimeMillis();
// 第一步 网购厨具
Callable<Chuju> onlineShopping = new Callable<Chuju>() {it
@Override
public Chuju call() throws Exception {
System.out.println("第一步:下单");
System.out.println("第一步:等待送货");
Thread.sleep(5000); // 模拟送货时间
System.out.println("第一步:快递送到");
return new Chuju();
}
};
FutureTask<Chuju> task = new FutureTask<Chuju>(onlineShopping);
new Thread(task).start();
// 第二步 去超市购买食材
Thread.sleep(2000); // 模拟购买食材时间
Shicai shicai = new Shicai();
System.out.println("第二步:食材到位");
// 第三步 用厨具烹饪食材
if (!task.isDone()) { // 联系快递员,询问是否到货
System.out.println("第三步:厨具还没到,心情好就等着(心情很差就调用cancel方法取消订单)");
}
Chuju chuju = task.get();
System.out.println("第三步:厨具到位,开始展示厨艺");
cook(chuju, shicai);
System.out.println("总共用时" + (System.currentTimeMillis() - startTime) + "ms");
}
// 用厨具烹饪食材
static void cook(Chuju chuju, Shicai shicai) {}
// 厨具类
static class Chuju {}
// 食材类
static class Shicai {}io
/**
* Created by yulinfeng on 12/17/16.
*/
public static class Task implements Callable<String> {
private String name;class
public Task(String name){
this.name = name;
}test
@Override
public String call() throws Exception {
Thread.sleep(2000);
String hello = hello(name);
return hello;
}
public String hello(String name){ return "hello " + name; } } }