package com.wenc.concurrency;
import java.util.Vector;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class Preloader {
private static class ProductInfo{
private String name = "fish";
private Vector<String> related = new Vector<String>(1000);
}
private static final ProductInfo productInfo = new ProductInfo();
private ProductInfo loadProductInfo() {
//模拟暂停3秒
for(int i=0;i<3;i++){
try {
Thread.sleep(1000);
System.out.println(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
throw new RuntimeException("exception test");//情形1,抛出异常
//return productInfo;//情形2,返回结果
}
private final FutureTask<ProductInfo> future = new FutureTask<ProductInfo>(
new Callable<ProductInfo>(){
public ProductInfo call() {
return loadProductInfo();
}
});
public void start(){
System.out.println("future start invoked");
new Thread(future).start();
}
/**
* future.get将阻塞直到任务进入完成状态,然后返回结果或者抛出异常
* @return
* @throws InterruptedException
* @throws ExecutionException
*/
public ProductInfo get() throws InterruptedException, ExecutionException{
System.out.println("future get invoked");
return future.get();
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
Preloader loader = new Preloader();
loader.start();
System.out.println(loader.get().related.capacity());
}
}
情形1抛出异常:
future start invoked
future get invoked
0
1
2
Exception in thread "main" java.util.concurrent.ExecutionException: java.lang.RuntimeException: exception test
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)
at java.util.concurrent.FutureTask.get(FutureTask.java:83)
at com.wenc.concurrency.Preloader.get(Preloader.java:51)
at com.wenc.concurrency.Preloader.main(Preloader.java:57)
Caused by: java.lang.RuntimeException: exception test
at com.wenc.concurrency.Preloader.loadProductInfo(Preloader.java:27)
at com.wenc.concurrency.Preloader.access$0(Preloader.java:17)
at com.wenc.concurrency.Preloader$1.call(Preloader.java:34)
at com.wenc.concurrency.Preloader$1.call(Preloader.java:1)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.lang.Thread.run(Thread.java:662)
情形2返回结果:
future start invoked
future get invoked
0
1
2
1000
欢迎回复讨论