Future
传统多线程在对某些需要获取线程处理结果的问题表现很差。
Future接口:获取Callable接口的返回值。
FutureTask类为Future接口子类,该类独有的特点为在高并发情况下不论有多少个线程,均只执行一次任务。
get()方法会阻塞当前进程直到有返回值为止。
经典的泡茶问题,简化了一点程序,看得懂就行。
package src.com.lzm;
import com.sun.xml.internal.ws.org.objectweb.asm.ClassAdapter;
// Future问题
import java.util.concurrent.*;
public class FutureClass {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<String> t1 = new FutureTask<String>(new washTea());
FutureTask<String> t2 = new FutureTask<String>(new makeTea(t1));
Thread thread1 = new Thread(t1);
Thread thread2 = new Thread(t2);
thread1.start();
thread2.start();
String result = (String) t2.get();
System.out.println(result);
}
}
// 洗茶叶
class washTea implements Callable<String> {
@Override
public String call() throws Exception {
try {
System.out.println("洗茶叶");
Thread.sleep(3000);
System.out.println("送茶叶");
Thread.sleep(3000);
} catch (InterruptedException e) {
}
return "龙井茶";
}
}
// 泡茶叶
class makeTea implements Callable<String> {
Future washTea;
public makeTea(Future ft1) {
this.washTea = ft1;
}
@Override
public String call() throws Exception {
System.out.println("等拿茶叶");
String str = (String) washTea.get();
System.out.println("拿到茶叶 " + str);
Thread.sleep(3000);
return "上茶...";
}
}
/* 结果:
等拿茶叶
洗茶叶
送茶叶
拿到茶叶 龙井茶
上茶...
*/