Furture模式
- 主线程开启一个子线程,子线程在处理一个非常耗时的任务,主线程就会立即返回一个Future对象。这个Future对象有一个成员变量result,子线程和主线程共享这个Future对象。
- 如果主线程,在子线程没有处理业务之前调用Future.getResult方法,则会发生阻塞。而子线程处理业务完成之后,会执行Future.setResult方法,此时Future对象的锁属于子线程。子线程执行setResult完毕之后,则会释放锁,同时会通知刚才的等待的主线程。主线程重新获得锁,执行getResult方法。从而获取子线程执行的结果result。
- 对于Future对象,只是一个代理真实数据的对象。而真实的数据为其成员变量result。子线程负责set真实数据,而主线程负责get真实数据。
- 在java多线程编程中,使用Callable<T>接口实现任务的执行。
public class TestThread {
public static void main(String[] args){
ExecutorService executorService = Executors.newFixedThreadPool(10);
//开启一个子线程,立即返回
Future<String> result = executorService.submit(new CustomTask());
//主线程阻塞,一直等待子线程返回真实的响应数据
System.out.println(result.getResult());
executorService.shutdown();
}
}
class CustomTask implements Callable<String>{
public String call() throws Exception {
Thread.sleep(10000);
System.out.println(Thread.currentThread());
return "complete task";
}
}