# 下面的示例代码就是Future特性来实现最优的“烧水泡茶”程序
- 首先,我们创建了两个FutureTask——ft1和ft2,ft1完成洗水壶、烧开水、泡茶的任务,ft2完成洗茶壶、洗茶杯、拿茶叶的任务;这里需要注意的是ft1这个任务在执行泡茶任务前,需要等待ft2把茶叶拿来,所以ft1内部需要引用ft2,并在执行泡茶之前,调用ft2的get()方法实现等待。
- 测试如何使用FutureTask实现经典的烧水泡茶程序
package com.uinnova.ftpsynweb.test;
import java.util.concurrent.*;
/**
* 分工、同步、互斥 烧水泡茶 Thread.join() CountDownLatch FutureTask
*
* @author xuyangyang
*/
public class FutureTaskMain {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// FutureTask futureTask = new FutureTask(() -> 1 + 2);
// ExecutorService service = Executors.newCachedThreadPool();
// service.submit(futureTask);
// Object o = futureTask.get();
// System.out.println(o);
new FutureTaskMain().run();
}
//创建任务T2的FutureTask
FutureTask<String> ft2 = new FutureTask<>(new T2Task());
//创建任务T1的FutureTask
FutureTask<String> ft1 = new FutureTask<>(new T1Task(ft2));
//线程T1执行任务
public void run() throws ExecutionException, InterruptedException {
Thread T1 = new Thread(ft1);
T1.start();
Thread T2 = new Thread(ft2);
T2.start();
System.out.println(ft1.get());
}
//洗水壶、烧水、泡茶
class T1Task implements Callable<String> {
FutureTask<String> ft2;
T1Task(FutureTask<String> ft2) {
this.ft2 = ft2;
}
@Override
public String call() throws Exception {
System.out.println("T1:洗水壶...");
TimeUnit.SECONDS.sleep(1);
System.out.println("T1:烧开水...");
TimeUnit.SECONDS.sleep(15);
//获取T2线程的茶叶
String tf = ft2.get();
System.out.println("T1:拿到茶叶:" + tf);
System.out.println("T1:泡茶...");
return "上茶: " + tf;
}
}
//洗茶壶、洗茶杯、拿茶叶
class T2Task implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("T2 :洗茶壶...");
TimeUnit.SECONDS.sleep(1);
System.out.println("T2:洗茶杯...");
TimeUnit.SECONDS.sleep(2);
System.out.println("T2:拿茶叶... ");
TimeUnit.SECONDS.sleep(1);
return "龙井";
}
}
}
- 执行结果
T1:洗水壶...
T2 :洗茶壶...
T1:烧开水...
T2:洗茶杯...
T2:拿茶叶...
T1:拿到茶叶:龙井
T1:泡茶...
上茶: 龙井